1.单例模式的定义
单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。
2.单例模式的3 个特点:
- 单例类只有一个实例对象;
- 该单例对象必须由单例类自行创建;
- 单例类对外提供一个访问该单例的全局访问点;
3.单例模式的结构与实现
单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。
序号 | 区别 | 单例类 | 普通类 |
---|---|---|---|
1 | 能new对象吗 | 否 | 是 |
2 | 构造函数修饰 | private | public |
3 | 对象实例的数量 | 有且仅有1个 | 任意 |
4 | |||
4.单例的实现
序号 | 区别 | 懒汉式 | 饿汉式 |
---|---|---|---|
1 | 线程安全 | 需要关键字volatile 和 synchronized来保证,每次访问时都要同步,会影响性能,且消耗更多的资源 | 线程安全 |
2 | 建立对象的时间 | 使用时创建 | 加载单例类时即创建,提前占用内存,避免使用时出现内存不足,超时问题 |
3 | 时间、空间成本 | 节省空间,不使用时不开辟空间 | 节省时间,节省判空的时间 |
5.单例模式的应用场景
前面分析了单例模式的结构与特点,以下是它通常适用的场景的特点。
-
在应用场景中,某类只要求生成一个对象的时候,如一个国家的总统或首相、每个人的身份证号等。
-
当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如 Web 中的配置对象、数据库的连接池等。
-
当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池、网络连接池等。
-
Windows 的回收站
-
操作系统中的文件系统
-
多线程中的线程池
-
显卡的驱动程序对象
-
打印机的后台处理服务
-
应用程序的日志对象
-
数据库的连接池
-
网站的计数器
-
Web 应用的配置对象
-
应用程序中的对话框
-
系统中的缓存
6.代码展示
6.1懒汉式
public class President {
//保证 instance 在所有线程中同步
private static volatile President instance=null;
//constructor
private President(){}
//private 避免类在外部被实例化,即不能new
public static synchronized President getInstance() {
//getInstance 方法前加同步
if(instance==null){
instance=new President();
}
return instance;
}
调用
President president = President.getInstance();
6.2饿汉式
/**
* 饿汉式
**/
public class BaJie {
//JVM加载BaJie类时,就创建了唯一的BaJie对象
private static BaJie instance = new BaJie();
//constructor
private BaJie(){}
public static BaJie getInstance(){
return instance;
}
}
调用
Bajie bajie = BaJie.getInstance();