定义
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,
并且是自行实例化的。
优缺点
- 优点
- 由于单例模式在内存中只有一个实例,减少了内存开支,特别实在一个对象需要频繁的创建、销毁时,而且创建活销毁时性能又无法优化
- 单例只产生一个实例,所以减少了系统性能的开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过
在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决 - 单例可以避免对资源的多重占用,例如一个写文件动作,,由于只有一个实例存在,避免对同一个资源文件的同时写操作
- 单例可以在系统设置全局的访问点,优化和共享资源访问
- 缺点
- 单例模式一般没有接口,扩展困难
- 单例模式跟单一职责原则有冲突。
使用场景
- 要求生成唯一序列号的环境
- 在整个项目中需要一个共享访问点或共享数据,例如web上的计数器
- 创建一个对象需要消耗的资源过多,如访问IO和数据库等资源
- 需要定义大量的静态常量和静态方法
代码实现
饿汉模式(线性安全)
package com.lidaxia.design.pattern.creational.singleton;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/19 21:01
*/
public class HungrySingleton {
private static HungrySingleton hungrySingleton = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getHungrySingleton() {
return hungrySingleton;
}
}
懒汉模式(线性安全)
package com.lidaxia.design.pattern.creational.singleton;
/**
* @author lidaxia
* @version 1.0
* @date 2022/11/19 20:59
*/
public class LazySingleton {
private static LazySingleton lazySingleton;
private LazySingleton() {
}
public static synchronized LazySingleton getLazySingleton() {
if (lazySingleton == null)
lazySingleton = new LazySingleton();
return lazySingleton;
}
}```