单例模式定义:
确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.
创建过程:
/** * 标准的单例模式代码结构 */ public class MySingleton { private static MySingleton ourInstance = new MySingleton(); // 通过此方法获得对象实例 public static MySingleton getInstance() { return ourInstance; } // 对外关闭构造方法 private MySingleton() { } // 其他方法 尽量做成 static public static void other(){ } }
优点:
- 在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁的创建、销毁时,而创建或销毁时性能又无法优化,单例模式的优势就非常明显
- 只生成一个实例,所以减少了系统性能的开销,当一个对象产生需要比较多的资源时,单例一般不会被JVM回收(需要注意JVM的回收机制)
- 单例模式可以避免对资源的多重占用
- 单例模式可以在系统设置全局的访问点,优化共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理
缺点:
- 一般没有接口,扩展很困难。
- 单例模式对测试不利,在并行开发环境中,如果单例模式没有完成,是不能进行测试的
- 单例模式与单一职责原则有冲突,一个类应该只实现一个逻辑,而不关心它是否是单例的
需要注意的地方:
关于线程安全代码(懒汉式单例)
/** * 懒汉式单例 */ public class MySingleton { private static MySingleton ourInstance = new MySingleton(); // 通过此方法获得对象实例 public static synchronized MySingleton getInstance() { if(ourInstance != null){ ourInstance = new MySingleton(); } return ourInstance; } // 对外关闭构造方法 private MySingleton() { } // 其他方法 尽量做成 static public static void other(){ } }