一、定义
一个类有且仅有一个实例,并且自行实例化向整个系统提供。
二、应用场景
- 创建对象时占用资源过多,但同时又需要用到该类对象。
- 对系统内资源要求统一读写,如读配置信息。
- 当多个实例存在可能引起程序逻辑错误,如号码生成器。
三、设计要点
- 一个类只能有一个实例;
- 必须自行创建实例;
- 必须自行向整个系统提供这个实例。
四、实现方式
- 只提供私有的构造方法;
- 含有一个该类的静态私有对象;
- 提供一个静态的公有方法用于创建、获取静态私有对象。
饿汉式
在声明对象的同时,直接进行初始化。(以空间换时间)
public class Singleton1 {
// 创建类私有构造
private Singleton1() {
}
// 创建该类型的私有静态实例
private static Singleton1 singleton1 = new Singleton1();
// 创建公有静态方法返回静态实例对象
public static Singleton1 getSingleton1() {
return singleton1;
}
}
懒汉式
在声明对象的同时不进行初始化,直到调用的时候才进行初始化。(以时间换空间)
public class Singleton2 {
// 创建类私有构造
private Singleton2() {
}
// 创建该类型的私有静态实例
private static Singleton2 singleton = null;
// 创建公有静态方法返回静态实例对象
public static Singleton2 getSingleton1() {
if (singleton == null)
singleton = new Singleton2();
return singleton;
}
}
饿汉式 | 懒汉式 |
---|---|
以空间换时间 | 以时间换空间 |
线程安全 | 存在线程风险 |
五、优缺点
- 优点:
- 在内存中只有一个对象,节省内存空间。
- 避免频繁的创建销毁对象,提高性能。
- 避免对共享资源的多重占用。
- 缺点:
- 扩展比较困难。
- 如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失。