单例设计模式-Java

Singleton Design Pattern-Java

本问题已经有最佳答案,请猛点这里访问。

下一组实施单一模式吗?我真的很困惑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Customer {

    static private Map costumers = new HashMap();

    private Customer() {
    }

    public static Customer getInstance(String name) {
        Customer instance = (Customer) costumers.get(name);
        if (instance == null) {
            instance = new Customer();
            costumers.put(name, instance);
        }
        return instance;

    }
}

谢谢


不,没有。除了线程安全和类型安全问题,我可以很容易地得到两个不同的Customer实例:

1
2
3
Customer x = Customer.getInstance("first");
Customer y = Customer.getInstance("second");
System.out.println(x == y); // false

所以不是单件的。这是一种工厂/飞重模式的混合,但它肯定不是单件模式。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SingltonPattern {

private static SingltonPattern instance = null;

protected SingltonPattern() {}

public static SingltonPattern getInstance() {
        if (instance == null) {
                // Thread Safe - Second layer
                synchronized (SingltonPattern.class) {
                        if (instance == null) {
                                instance = new SingltonPattern();
                        }
                }
        }
        return instance;
}

这是一个关于singlton-dp的模式。


它不是。在给定的示例中,将为每个不同的客户名称创建一个新的客户实例。这不应该发生在单身的情况下。应该只有一个为所有客户名称创建和共享的客户实例。客户实例需要是私有静态的,并且只应创建和分配一次。


单例设计模式是最简单的设计模式之一,它确保只能创建类的一个对象,并提供对该实例的全局访问点。

它属于创造性设计模式,因为它提供了创建对象的最佳方法之一。

当我们只需要类的一个实例(例如多个对象共享的单个DB连接)时,这很有用,因为为每个对象创建单独的DB连接可能代价高昂。同样,应用程序中可以有一个配置管理器或错误管理器来处理所有问题,而不是创建多个管理器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Singleton
{
    private static Singleton instance;

    // private constructor to restrict the instantiation of Singleton Class
    private Singleton() {

    }

    //GetInstance method to provide global access to Singleton instance
    public static Singleton getInstance()
    {
        if (instance==null)
            instance = new Singleton();
        return instance;
    }
}

更多详情请参考帖子