单例模式(Singleton Pattern)
其定义为:Ensure a class has only one instance , and provide a global point of access to it.
单例模式的通用类图为:
单例模式的优点:
1、由于单例模式在内存中一个实例,减少了内存开支,特别是对一个对象需要频繁的创建、销毁时,而且创建或者销毁时性能又无法优化,单例模式很适用。
2、由于单例模式只生成一个实例,所以减少了系统开销,当一个对象产生需要比较多的资源时,如读取配置,产生其他的依赖对象时,则可以在启动的时候创建一个单例对象来解决。
3、单例模式可以避免对资源的多重占用,因只有一个实例在内存中。
4、单例模式可以在系统中设置全局的访问点,优化和共享资源访问。
单例模式的缺点:
1、单例模式一般没有接口,扩展很困难。
2、单例模式对测试时不利的,在并行开发环境中,如果单例模式还没有完成,是不能进行测试的。
3、单例模式与单一职责原则有冲突。
单例模式的注意事项:
在高并发情况下,需要注意单例模式的线程同步问题。如下:
public class Singleton{ private static Singleton singleton = null; private Singleton(){} public static Singleton getSingleton(){ if(singleton == null){ singleton = new Singleton(); } return singleton; } }
该段代码会出现多个实例:如一个线程A执行到singleton = new Singleton();单还没有获取对象,第二个线程B也执行到singleton == null,那么线程B也将进入if语句中获得一个实例,,这样在内存中就出现了两个实例。解决这个线程不安全的方法可以在方法前加上关键字synchronized,或者在方法中增加synchronized。