单例模式应该是每个开发必须知道的设计模式,也十分简单,指保证整个程序中只有一个实例。
1.私有化构造函数
如果外部可以调用构造函数,那么就无法保证单例
1.1 饱汉模式
私有化构造函数 Private, 内部提前初始化 一个 实例
package singleton;
public class Singleton {
private static Singleton singleton = new Singleton();//这里初始化,保证只有一个实例
private Singleton() {//private 外部无法初始化,导致只有Singleton类内部可以调用构造函数
System.out.println("generate a singleton.");
}
public static Singleton getInstance() {//提供给外部可以调用获得实例的接口
return singleton;
}
}
1.2 饿汉模式
提前声明,但不初始化,直到需要的时候在初始化,不加同步锁可能会出现冲突,得到多个实例。比如加入两个线程同时调用getInstance(),这个时候singleton都是null,则都会new 实例。
package singleton;
public class HungrySingleton {
private static HungrySingleton singleton;
private HungrySingleton() {
System.out.println("generate a singleton.");
}
public static HungrySingleton getInstance() {
if (singleton == null) {
singleton = new HungrySingleton();
return singleton;
}
return singleton;
}
}