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