2016-12-28 85 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(); 
    } 

}