我目前正在开展一个学生项目,并想知道是否有办法专门用工厂方法创建对象?
public class PersonFactory {
public static Person createPerson() {
// some constraints ...
return new Person();
}
}
我的示例PersonFactory.java
应该使用Person
方法返回createPerson()
个对象。
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();
}
}
提前非常感谢你;)
答案 0 :(得分:6)
您可以将Person
构造函数包设为私有(即删除public
访问修饰符),这样只允许来自同一个包的类访问它。
然后,如果PersonFactory
属于与Person
相同的包,则可以访问该构造函数。
如果PersonManagement
属于不同的包,则无法访问该构造函数。
另一个选择是保留Person
构造函数private
并将createPerson()
方法移至Person
类。
答案 1 :(得分:3)
我通常通过将工厂方法放在Person
类而不是单独的工厂类中来解决问题。在这种情况下,构造函数可以是私有的,Person
对象可以从工厂方法获得,而不是其他任何地方。不过,不知道这是否适合你的设计。
如果您不想要工厂方法static
,那么这里可能存在一个问题。但是,我看到你的是,所以这不应该阻止你。
答案 2 :(得分:1)
使用Java的可见性概念,您无能为力。您可以从public
构造函数中删除Person
,然后只有Person
的相同包中的这些类(以及Person
的子类)才能访问构造函数。如果PersonManagement
在另一个包中,则无法访问构造函数。
另一种方法是将Person设置为PersonFactory的内部类(或其他方式),然后私有构造函数也应该工作,并且外部类之外的任何人都无法访问它。
答案 3 :(得分: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();
}
}