定义:
- 确保某一个类只有一个实例,而且自行实例化并向整个体系提供实例。
优点:
- 减少内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化。
- 减少了性能开销,当一份对象的产生需要较多资源的时,如读取配置、产生其他以来对象,则可以通过在应用启动时创建一个单例对象,然后永驻内存(jave EE中注意jvm垃圾回收机制)
- 设置全局的访问点,优化共享资源,可以设计一个单例类,负责所有的数据表的映射处理
缺点:
- 单例模式通常没有接口,拓展很难。单例模式是要求自行实例化,而接口和抽象类不可能被实例化。
- 对测试不利,在并行开发的环境下,如果单例没有完成,是不能进行测试的,没有接口也不能使用mock的方式虚拟对象。
- 单例模式与单一职责原则有冲突,一个类应该只实现一个逻辑,而不应该关心是否是单例,单例取决于环境,单例模式把“要单例”和业务逻辑融合在一个类中。
注意事项:
-
单例模式的线程同步问题:
//饿汉式
public class SingleDemo {
// 私有化构造函数
private SingleDemo() {
}
// 提供已经初始化完毕的对象
private static final SingleDemo sd = new SingleDemo();
// 提供静态的获取方法
public static SingleDemo getInstance() {return sd; } }
单例模式的拓展:
-
产生固定数量对象(线程安全)
//产生指定数量的对象
public class FixedCountObject {
private static int countOfMax = 5;// 创建对象的总数量private static int currentNum = 0; private static Vector<String> nameVector = new Vector(); private static Vector<FixedCountObject> objectVector = new Vector(); static {// 初始化 for (int i = 0; i < countOfMax; i++) { objectVector.add(new FixedCountObject("object->" + i)); } } private FixedCountObject() { }; private FixedCountObject(String name) { nameVector.add(name); }; // 随机获取对象 public static FixedCountObject getInstance() { Random random = new Random(); currentNum = random.nextInt(countOfMax); return objectVector.get(currentNum); } }
网友评论