2016-12-28 119 views
5

我目前正在研究一個學生項目並想知道是否有方法使用工廠方法專門創建對象?獨家使用工廠創建對象

public class PersonFactory { 

    public static Person createPerson() { 
     // some constraints ... 
     return new Person(); 
    } 

} 

我示範PersonFactory.java應該與它的createPerson()方法返回Person對象。

public class Person { 

    // some examples ... 
    private String name; 
    private int age; 

    public Person() { 
     // ... 
    } 

} 

這工作得很好,但在main計劃,我仍然能夠創造Person對象與它們共同構造函數(因爲它是public)。但是,如果我將構造函數更改爲private,工廠方法也無法訪問它。

public class PersonManagement { 

    public static void main(String[] args) { 
     // both still works ... 
     Person p1 = new Person(); 
     Person p2 = PersonFactory.createPerson(); 
    } 

} 

非常感謝你提前;)

+1

注意工廠模式不會強制你使用工廠類。定義一個私有構造函數並使用工廠方法(即getInstance())可以被子類實現或覆蓋,也是模式的有效用法。 –

回答

3

我通常將工廠方法放在Person類中,而不是在單獨的工廠類中解決問題。在這種情況下,構造函數可以是私有的,並且Person對象可以從工廠方法中獲取,而在其他任何地方都可以獲得。不過,不知道這是否適合您的設計。

這裏的一個潛在問題是如果你不想你的工廠方法static。但是,我看到你的是,所以這不應該阻止你。

+0

請注意,您可以通過將工廠類設置爲目標類中的公共類,靜態內部類,併爲工廠類提供公共實例方法來解決靜態問題。 –

6

可以使Person構造包私有(即除去public訪問修飾符),這將只允許來自同一個包中的類來訪問它。

然後,如果PersonFactory屬於同一個包Person,就可以訪問該構造函數。

如果PersonManagement屬於不同的包,它將無法訪問該構造函數。

另一種選擇是保持Person構造private和移動createPerson()方法將Person類。

1

隨着Java的可見性概念,你可以做的事情不多。您可以從Person構造函數中刪除public,然後只有Person(和Person的子類)的相同包中的這些類才能訪問該構造函數。如果PersonManagement在另一個包中,則它將無法訪問該構造函數。

另一種方法是將Person創建爲PersonFactory的內部類(或其他方法),然後私有構造函數也應該工作,並且外部類之外的任何人都無法訪問它。

0

非常感謝,這一個幾乎解決我的問題:

public class Person { 

    // some examples ... 
    private String name; 
    private int age; 

    private Person() { 
    } 

    public static Person createPerson() { 
     // some constraints ... 
     return new Person(); 
    } 

} 

而且main作品精緻漂亮,以及:

public class PersonManagement { 

    public static void main(String[] args) { 
     Person p1 = Person.createPerson(); 
     // not possible anymore ... 
     Person p2 = new Person(); 
    } 

}