通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的方法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。 [DP]
1. 概念
一个实现Singleton
类一般拥有以下两个方法,构造函数Singleton()
,以及获取实例的方法GetInstance()
。如下图所示:
需要注意的是,构造方法
Singleton()
要私有化(用private修饰),获取实例的方法GetInstance()
要设置为静态(static)。
2. 实现方法
- 懒汉式
//懒汉式单例类.在第一次调用的时候实例化自己
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
- 恶汉式
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
3. 多线程时的单例模式
在多线程时,一般采用双重锁定的方式来实现单例模式
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}