定义:
Ensure a class has only one instance, and provide a global point of access to it.
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
饿汉式
package com.anllin.designpattern; public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } }
懒汉式
package com.anllin.designpattern.singleton; public class Singleton { private static Singleton instance = null; private Singleton() { } public synchronized static Singleton getInstance() { if(null == instance) { instance = new Singleton(); } return instance; } }
优点:
- 减少了内存开支。
- 减少了系统的性能开销。
- 避免资源的多重占用。
- 可以在系统设置全局的访问点,优化和共享资源访问。
缺点:
- 没有接口,扩展困难。
- 对测试不利,无法进行TDD。
- 与单一职责原则冲突。应根据实际情况判断是否使用。
使用场景:
在一个系统中,要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反应”,可以采用单例模式,具体的场景如下:
- 要求生成唯一序列号的环境。
- 在整个项目中需要一个共享访问点或共享数据,例如一个web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的。
- 创建一个对象需要消耗的资源过多,如访问IO和数据库等资源。
- 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式。
以上内容摘自《设计模式之禅》,需要了解细节的话,请自己下载书翻看。