饿汉模式
//普通员工
public class Staff {
public void work() {
//干活
}
}
//副总裁
public class VP extends Staff {
@Override
public void work() {
//管理下面的经理
}
}
//CEO,饿汉单例模式
public class CEO extends Staff {
private static final CEO mCeo = new CEO();
//构造函数私有
private CEO() {
}
//共有的静态函数,对外暴露获取单例对象的接口
public static CEO getCeo(){
return mCeo;
}
@Override
public void work(){
//管理VP
}
}
CEO
类不能通过new
的形式构造对象,只能通过CEO.getCEO()
函数获取,而这个CEO
对象是静态对象,并且在声明的时候就已经初始化了,这就保证了CEO
对象的唯一性。
懒汉模式
懒汉模式是声明一个静态对象,并且在用户第一次调用getInstance
时进行初始化,而上述的饿汉模式是在声明静态对象时就已经初始化。
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static synchronized Singleton getInstance(){
if (instance == null){
instance=new Singleton();
}
return instance;
}
}
懒汉模式下,getInstance()
方法中添加了synchronized
关键字,使得getInstance()
成为一个同步方法,这就保证单例对象在多线程情况下的唯一性。
缺点:第一次加载时需要及时进行实例化,反应稍慢,最大的问题是每次调用getInstance()
都进行同步,造成不必要的同步开销。一般不建议使用。
Double Check Lock (DCL) 实现单例
public class Singleton {
private static Singleton mInstance=null;
private Singleton(){
}
public void doSomething(){
System.out.println("do sth.");
}
public static Singleton getInstance(){
if(mInstance==null){
synchronized (Singleton.class){
if(mInstance==null){
mInstance=new Singleton();
}
}
}
return mInstance;
}
}
静态内部类单例模式
public class Singleton {
private Singleton() { }
public static Singleton getInstance() {
return SingletonHolder.sInstance;
}
/**
* 静态内部类
*/
private static class SingletonHolder {
private static final Singleton sInstance = new Singleton();
}
}
推荐使用静态内部类方法实现单例
枚举单例
public enum SingletonEnum {
INSTANCE;
public void doSomething(){
System.out.println(" do sth.");
}
}
使用容器实现单例
public class SingletonManager {
private static Map<String,Object> objMap = new HashMap<String,Object>();
private SingletonManager() { }
public static void registerService(String key,Object instance) {
if (!objMap.containsKey(key)){
objMap.put(key,instance);
}
}
public static Object getService(String key) {
return objMap.get(key);
}
}
网友评论