单例模式基本上是每一个程序员都能随手写的设计模式,牢记两私一公的原则:即私有构造函数,私有静态实例属性,公共的获取实例的静态方法。
遵循这个原则写一个,
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
以上这个是传统单线程环境下的写法,缺点是线程不安全,那么就改造一下,通过synchronized保证线程安全。
public class Singleton {
private static Singleton instance = null;
private Singleton() { }
public static Singleton getInstance() {
if (instance != null) {
return instance;
}
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
return instance;
}
}
看起来好像好多了,保证了线程安全,实例初始过了就直接返回实例不进入同步代码块,但是,还是有更好的写法:
public class Singleton {
private Singleton() {}
public static Singleton getInstance() {
return EnumSingleton.INSTANCE.getSingleton();
}
private enum EnumSingleton {
INSTANCE;
private Singleton singleton;
EnumSingleton() {
singleton = new Singleton();
}
public Singleton getSingleton() {
return singleton;
}
}
}
枚举本身是无法通过反射、克隆、反序列化等把对象初始出来的,所以据说是完美写法,当然如果有更好的,请大佬私聊一下,本菜鸡感激不尽!!!