一. 定义
- 确保一个类只有一个实例,可以用在建立目录、数据库连接等需要单线程操作的场合,用于实现对系统资源的控制;
- 单例类的构造方法是私有的,避免外部使用构造方法创建实例;
- 单例类不能被继承,因为其构造函数是私有的;
二. 饿汉式单例类
1. 代码
package com.xiaobai.design_pattern;
/**
* @author wangtw
* @ClassName HungrySingleton
* @description: 饿汉式单例类
* @date 2023/6/315:59
*/
public class HungrySingleton {
private static HungrySingleton hungrySingleton = new HungrySingleton();
// 构造方法私有,保证外界无法直接实例化
private HungrySingleton() {
}
// 通过该方法获得实例对象
public static HungrySingleton getInstance() {
return hungrySingleton;
}
}
2. 特点
(1)在类被加载时,单例类的实例就会被创建;
三. 懒汉式单例类
1. 代码
package com.xiaobai.design_pattern;
/**
* @author wangtw
* @ClassName LazySingleton
* @description: 懒汉式单例类
* @date 2023/6/316:02
*/
public class LazySingleton {
private static LazySingleton lazySingleton = null;
// 构造方法私有
private LazySingleton() {}
// 加互斥锁
synchronized public static LazySingleton getInstance() {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
2. 特点
(1)懒汉式单例类在加载时不会将在自己实例化,是在第一次调用时被实例化;
(2)需要使用synchronized关键字给getInstance()方法加互斥锁,避免在多线程情况下出现多个实例;
四. 总结
1. 单例模式优点
(1)减少了内存开支,由于单例类的实例没有被频繁创建、销毁;
(2)减少了系统的性能开销,可以应用于读取配置、产生其它依赖对象,让其在应用启动期间保存在内存中;
(3)避免对资源的多重占用;
(4)可以优化和共享资源访问,例如数据表的映射处理;
2. 单例模式缺点(原文照抄)
(1)单例模式无法被子类继承,扩展困难;
(2)单例模式与单一职责原则有冲突,一个类应该只实现一个逻辑,而不关心它是否时是单例的;
韩敬海 设计模式(Java版)