package _1Singleton; public class Singleton { private static Singleton singleton = new Singleton(1); private Singleton(int i) { System.out.println(i); } /** * Solution 1 * 在调用本类任何参数或方法时,singleton都将被实例化 * * @return */ public static Singleton getInstance() { return singleton; } /** * Solution 2 * 在第一次调用的时候实例化,但是需要同步的开销 * * @return */ public static Singleton getInstance2() { if(singleton == null) { synchronized(Singleton.class) { if(singleton == null) { singleton = new Singleton(2); } } } return singleton; } /** * Solution 3 * 在第一次调用的时候实例化,不需要同步 * * @return */ public static Singleton getInstance3() { return SingletonHolder.instance; } /** * @param args */ public static void main(String[] args) { Singleton.getInstance(); } private static class SingletonHolder { private static Singleton instance = new Singleton(3); } }
上面列举了三种单例模式的实现方式,当然方案一是最简单的,建议使用。
单例的优点:
- 减少内存开销
- 减少系统性能开销
- 避免对资源的多重占用
- 单例模式可以在系统设置全局的访问点,优化和共享资源访问(例如一个单例类用来负责所有数据表的映射处理
单例的缺点:
- 单例模式一般没有接口,不容易扩展,功能改动时基本上只能修改代码
- 如果单例没有完成,无法进行测试工作
- 单例模式与单一职责原则有冲突。
- 需要保证线程安全
单例的应用场景:
- 要求省城唯一序列号的环境
- 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面的访问计数器
- 创建一个对象需要消耗的资源过多,如访问IO和数据库等资源
- 需要定义大量的静态常量和静态方法(如工具类)的环境