使用Factory专门创建对象

时间:2016-12-28 08:39:04

标签: java object factory

我目前正在开展一个学生项目,并想知道是否有办法专门用工厂方法创建对象?

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();
    }

}

提前非常感谢你;)

4 个答案:

答案 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();
    }

}