Singleton类作为对象的容器

时间:2016-12-19 11:47:00

标签: java oop

我需要创建在整个程序中可见的对象(在各种类中)。我不想为这些类创建单例,因为我可能需要一些实例。所以我创建了一个类型为Singleton的类作为容器,在其中我创建了可以在程序中的任何位置使用的对象。 下面是一个示例代码,您可以在其中查看正在进行的操作。参考Container的实例,我将始终可以访问在那里创建的设施。我正在建立一个学习的课程。会有很大但我想出了解决问题的想法。问题是不同的控制器需要一个显式对象,那里有任何数据。然后根据完整对象执行计算。

public class Person {

    String name;
    String surname;
    int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSurname() {
        return surname;
    }
    public void setSurname(String surname) {
        this.surname = surname;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person(String name, String surname, int age) {
        this.name = name;
        this.surname = surname;
        this.age = age;
    }

    public Person(){    
    }
}

public class Container {

    private Person person1;
    private Person person2;

    private static Container singleton = new Container( );

    public Container() {
        person1 = new Person();
        person2 = new Person();
    }

    public Person getPerson1(){
        return person1;
    }

    public Person getPerson2(){
        return person2;
    }


    public static Container getInstance( ) {
          return singleton;
       }    
}

public class Test {

    public static void main(String[] args) {
        Person person;
        Container singleton = Container.getInstance();
        person = singleton.getPerson1();

        person.setName("John");


        Person personTest1;
        Container singleton2 = Container.getInstance();
        personTest1 = singleton2.getPerson1();

        System.out.println(personTest1.getName());
    }
}

输出:

约翰

它可能不是最好的解决方案,但没有找到这样简单快速的解决方案。你觉得怎么样?

2 个答案:

答案 0 :(得分:2)

我只有一些评论:Container您的Person工厂不应该由客户端实例化。
否则,客户可以创建多个版本的person1和{ {1}}。

想象一下这段代码:

person2

为避免这种情况,您应该将构造函数设为私有。

    Container singleton = Container.getInstance();
    Person person = singleton.getPerson1();
    person.setName("John");


    Container singleton2 = new Container();
    Person personTest1 = singleton2.getPerson1();
    System.out.println(personTest1.getName());

答案 1 :(得分:0)

我在这里使用枚举。

代码更清晰,使用更多对象更容易扩展,因为每次添加其他内容时都不需要创建getter。

作为奖励,您不必担心线程安全,急切启动或暴露构造函数。

null