设计模式:单例(singleton)

单例应该是应用最广泛的设计模式之一了,它用于确保在整个系统中只存在一个指定类的实例,共享其数据及操作。

  • 基本用法:(Java)
public class SingletonClass {
    private static SingletonClass instance = new SingletonClass();
    
    public static SingletonClass getInstance()
    {
        return instance;
    }
}
  •  建议给这个单例类加上final修饰(C#则是sealed),以免被不当继承。
  •  上面的代码仅仅是最基本的(线程安全),其中没有防止外部去不当地实例化。所以可以改为以下方式:

public final class SingletonClass {
    private static SingletonClass instance = new SingletonClass();
    
    public static SingletonClass getInstance()
    {
        return instance;
    }
    
    private SingletonClass(){}
}

  这里通过把默认构造函数可见性设为private,来避免外部调用。

  •  Lazy initialization方式
public final class SingletonClass {
    private static SingletonClass instance = null;

    public static synchronized SingletonClass getInstance() {
        if (instance == null)
            instance = new SingletonClass();
        return instance;
    }

    private SingletonClass() {
    }
}

  这种方式的好处是,在未被调用时不需要创建实例;但在多线程开发时要考虑到线程安全(注意代码中的synchronized)。

 

相关问题:

  • 能否创建一个抽象类的单例?

    这个问题本身可以说是不恰当地使用了设计模式。从上面的例子可以看出,由于抽象类不能被实例化,当然也就不能声明这样一个静态实例了。(当然从代码层面上说,还是可以声明一个静态抽象类对象,但它无法被正确创建或确保不被替换)

posted @ 2016-11-10 16:50  AngelXiao  阅读(177)  评论(0编辑  收藏  举报