[初]设计模式之单例模式
2016-12-22 15:24
106 查看
单例模式使用场景: 保证一个类有且只有一个对象的场景;
五种方式及其差异:
一:
public static Single getInstance() { //获取单例
return sIntance;
}
}
模式一的好处:能保证只有一个实例
不管以哪种形式实现单例模式,它们的核心原理都是将构造函数私有化,并且通过静态方法获取一个唯一的实例,
在这个获取的过程中你必须保证线程安全、反序列化导致重新生成实例对象等问题,该模式简单,但使用率较高。
由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决;
单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。
五种方式及其差异:
一:
// 单例模式一 public class Single{
private static final Single sIntance = new Single(); //类在初始化时就创建实例private Single() {} //禁止外部创建实例
public static Single getInstance() { //获取单例
return sIntance;
}
}
模式一的好处:能保证只有一个实例
模式一的弊端:类初始化的时候,就创建了实例,不利于资源时效性 //单例模式二
public class Singleton { private static Singleton mInstance = null; private Singleton() {} /** * 方式二、double-check, 避免并发时创建了多个实例, 该方式不能完全避免并发带来的破坏. * * @return */ public static Singleton getInstance() { if (mInstance == null) { synchronized (Singleton.class) { if (mInstance == null) { mInstance = new Singleton(); } } } return mInstance; } }
/** * 方式三 : 在第一次加载SingletonHolder时初始化一次mOnlyInstance对象, 保证唯一性, 也延迟了单例的实例化, * 如果该单例比较耗资源可以使用这种模式. * * @return */ public static Singleton getInstanceFromHolder() { return SingletonHolder.mOnlyInstance; }
/** * 静态内部类 * * */ private static class SingletonHolder { private static final Singleton mOnlyInstance = new Singleton(); }
/** * 方式四 : 枚举单例, 线程安全 * */ enum SingletonEnum { INSTANCE; public void doSomething() { System.out.println("do sth."); } }
/** * 方式五 : 注册到容器, 根据key获取对象.一般都会有多种相同属性类型的对象会注册到一个map中 * instance容器 */ private static Map<string singleton=""> objMap = new HashMap<string singleton="">(); /** * 注册对象到map中 * @param key * @param instance */ public static void registerService(String key, Singleton instance) { if (!objMap.containsKey(key) ) { objMap.put(key, instance) ; } } /** * 根据key获取对象 * @param key * @return */ public static Singleton getService(String key) { return objMap.get(key) ; }
不管以哪种形式实现单例模式,它们的核心原理都是将构造函数私有化,并且通过静态方法获取一个唯一的实例,
在这个获取的过程中你必须保证线程安全、反序列化导致重新生成实例对象等问题,该模式简单,但使用率较高。
优点
由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决;
单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。
缺点
单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。相关文章推荐
- 闲聊设计模式和类
- 好书整理系列之-设计模式:可复用面向对象软件的基础 5
- 好书整理系列之-设计模式:可复用面向对象软件的基础 4
- 好书整理系列之-设计模式:可复用面向对象软件的基础 3
- 好书整理系列之-设计模式:可复用面向对象软件的基础 2
- 好书系列之-设计模式:可复用面向对象软件的基础 1
- 好书整理系列之-设计模式:可复用面向对象软件的基础 5.5
- 设计模式、用Delphi描述-->Abstract Factory模式
- 设计模式、用Delphi描述-->Factory Method模式
- 设计模式、用Delphi实现---->Strategy模式
- 与大虾对话: 领悟设计模式
- 好书整理系列之-设计模式:可复用面向对象软件的基础 6
- 设计模式入门(1)------单件(Singleton)
- 设计模式、用Delphi描述-->Reference Count pattern
- Engine-Collection-Class,一种用来建立可重用企业组件的设计模式
- 好书整理系列之-设计模式:可复用面向对象软件的基础 7
- 好书整理系列之-设计模式:可复用面向对象软件的基础 8
- Jive 中的设计模式
- 设计模式、用Delphi描述-->Visitor模式
- 设计模式、用Delphi实现---->Template Method模式