#Singleton Pattern#
Ensure a class has only one instance, and provide a global point of access to it.
Singleton Pattern的通用代码
饿汉式单例模式
public class Singleton { private static final Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance() { return singleton; } public static void doSomething() { } }
懒汉式单例模式
public class Singleton2 { private static Singleton2 singleton2 = null; private Singleton2() { } public static Singleton2 getInstance() { if(null == singleton2) { synchronized (Singleton2.class) { if (null == singleton2) { singleton2 = new Singleton2(); } } } return singleton2; } }
Singleton Pattern应用
优点
- 单例模式在内存中只有一个实例,减少了内存的开支,特别是一个对象需要频繁的创建、销毁时,而且创建或销毁时的性能有无法优化。
- 单例模式在内存中生成一个实例,减少了系统的性能开销。当一个对象的产生需要比较多的资源时,如读取配置、产生依赖对象时,则可以通过一个单例模式,然后用永久驻留内存的方式解决。(在javaEE中采用单例模式,需要注意JVM垃圾回收机制)
- 单例模式可以避免对资源的多重占用。如一个写文件操作,优于只有一个实例存在内存中,可以避免对同一个源文件的同时写操作。
- 单例模式可以在系统设置全局的访问点,优化和共享资源访问。如可以设计一个单例类,复制所有的数据的映射处理。
缺点
- 单例模式一般没有接口,扩展很困难。
- 单例模式对测试是不利的。
- 单例模式与单一职责原则则有冲突。
使用场景
在一个系统中,要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反应”,可以采用单例模式。
- 要求生成唯一序列号的环境。
- 在整个项目中需要一个共享访问点或共享数据。如一个WEB页面上的计数器,可以不用把每个每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是现成安全的。
- 创建一个对象需要消耗的资源过多。如要访问IO和数据库等资源。
- 需要定义大量的静态常量和静态方法的环境,可以采用单例模式,也可以考虑使用static关键字。