一个正常的饿汉单例模式
1 //CEO,饿汉单例模式 2 3 public class CEO extends Staff{ 4 5 private static final CEO mCeo = new CEO(); 6 7 //构造函数私有 8 9 private CEO(){ 10 11 } 12 13 //公有的静态函数,对外暴露获取单例对象的接口 14 15 public static CEO getCeo(){ 16 17 return mCeo; 18 19 } 20 21 @Override 22 23 public void work(){ 24 25 //管理VP 26 27 } 28 29 }
这种最简单的单例模式存在资源消耗、线程安全等问题,所以正常开发过程中并不推荐使用这种单例模式。
常见的单例模式还有DCL方式的单例模式、静态内部类单例模式,但这些都会出现反序列化时重新创建对象的问题。
以上单列模式避免对象在被反序列化时重新生成对象,那么必须加入这个方法:
1 private Object readResolve() throws ObjectSteamException{ 2 3 return sInstance; 4 5 }
下面介绍两种Android项目中常用的单例模式的实现:
枚举单例
1 public enum SingletonEnum{ 2 3 INSTANCE; 4 5 public void doSomething(){ 6 7 System.out.println("do.sth."); 8 9 } 10 11 }
使用容器实现单例模式
1 public class SingletonManager{ 2 3 private static Map<String,Object> objMap = new HashMap<String,Object>(); 4 5 private SingletonManager(){ 6 7 } 8 public static void registerService(String key,Object instance){ 9 if(!objMap.containsKey(key)){ 10 objMap.put(key,instance); 11 } 12 } 13 public static Object getService(String key){ 14 return objMap.get(key); 15 } 16 }
单例模式的核心原理都是将构造函数私有化,并且通过静态方法获取一个唯一的实例。