本文共 941 字,大约阅读时间需要 3 分钟。
单例模式
1. 定义:
Ensure a class has only one instance, and provide a global point of access to it(确保一个类只有一个实例,并且提供一个全局访问点以访问到它);
2. 分析:
- 通过减少类实例的数量,减少内存开支,提高系统性能,当然,前提是整个系统有这一个实例便可完成相应的工作。(可以只有一个);比如,线程池、负责数据表映射处理的类、建立数据库连接的类等
- 保证系统工作正常,确保数据统一一致,它们多处理一些共享数据或者保证某类资源的合理有效使用(只能有一个);比如,充当显卡驱动程序、打印机驱动程序的对象、日志对象、处理设置偏好的对象;
3. 实现方法:
- 不允许外界通过调用该类的构造函数创建对象;(确保唯一) 通过使用private访问修饰符修饰构造函数以实现隐藏构造函数的目的;
- 该类对外提供一个得到唯一实例的方法;(提供全局访问点) 全局访问点(获取唯一实例的方法)的(多线程安全)实现方法共有三种: 2.1) 简单使用Synchronized关键字修饰该方法;该方法简单粗暴,解决问题的同时会降低程序的性能(同步一个方法可能会造成程序执行效率下降100倍); 适合在访问方法的性能对程序影响不大的情况下使用; 2.2)双重检查加锁 简单使用Synchronized关键字同步方法会使得每次调用该方法时均发生同步,然而线程不安全的情况只会发生第一次调用该方法的时候(这时候尚未创建对象实例,所以可能存在多个线程进入创建对象的代码块),当对象创建完毕后该方法就不需要再同步,因为所有的线程都会进入直接返回实例的代码块;为解决该问题,使用volatile关键字修饰静态变量,并且只同步创建对象的代码块; 该方法适合在访问性能对程序影响较大的情况下适用 2.3)在声明唯一变量时就完成初始化,然后在该方法里直接返回该变量;第一、二种方法都是在需要该变量的时候才“被动”创建该变量,方法三则是“主动”创建该变量,这样使用该变量的时候就一定存在该变量,也就无需检查了。
4. 体现的
- 单一职责原则:单例模式的设计应当足够专注,避免类太过臃肿;
- 不涉及里氏替换原则、依赖倒置原则、迪米特原则以及其他原则
转载地址:http://ekmsi.baihongyu.com/