Singleton(单件) 创建型 对象 1
Intent_意图2
确保一个类只有一个实例,并提供全局访问点
Motivation_动机3
确保只有一个实例会被创建,并提供全局访问点,同时能规避全局变量带来的初始资源耗费,以及一个全局使用的类频繁的创建与销毁
Applicability_适用性4
1.想控制实例数目,节省系统资源
2.配置文件的读取
3.连接池、线程池、缓存的统一管理调试
Structure_结构5
Participants_参与者6
- Singleton(单件) 只能自我创建唯一实例的单件类
Collaborations_协作7
Singleton类通过Lazy懒汉模式、Eagerly饿汉模式、Double-checked locking双重锁模式、静态内部类模式以及枚举模式创建自身实例
Comsequences_结果8
- 优点
在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例
避免对资源 的多重占用 - 缺点
没有接口,不能继承,导致单件类的职责过重,违背了“单一职责原则”,同时也没有抽象类,扩展起来有一定的困难 - 用途
要求生产唯一序列号
创建的对象需要消耗的资源过多,比如I/O、数据库连接等
Implementation/Sample Code_实现/范例代码910
Lazy thread-safe
// 第一次调用时才初始化,避免内存浪费,但必须加锁synchronized才能保证单件,影响效率
public class Singleton {
private static Singleton uniqueInstance;
private Singleton(){}
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
Lazy thread-unsafe
// 最基本的单件实现方式,不要求线程安全,在多线程不能正常工作
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
Eagerly
// 基于classloader机制避免了多线程同步问题,但类加载时就初始化,比较浪费资源
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return uniqueInstance;
}
}
Double-checked locking
// 双重校验锁,安全且在多线程情况下能保持高性能
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
Check-in
// 能达到和Double-checked locking一样的功效。对静态域使用延迟初始化,使用这种方式。
// Check-in只适用于静态域的情况,Double-checked locking可在实例需要延迟初始化时使用
public class Singleton {
private static class SingletonHolder {
private static final Singleton UNIQUE_INSTANCE = new Singleton();
}
private Singleton() {}
public static final Singleton getInstance() {
return SingletonHolder.UNIQUE_INSTANCE;
}
}
Enum
// 自动支持序列化机制,完全防止多次实例化
public enum Singleton {
UNIQUE_INSTANCE;
}
Known Uses_已知应用11
java.util.Calendar
Related Patterns_相关模式12
模式分类归属 ↩︎
意图:描述该模式的作用,以及该模式的定义 ↩︎
动机:给出了问题以及如何解决这个问题的具体场景 ↩︎
适用性:描述模式可以被应用在什么场合 ↩︎
结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎
参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎
协作 :告诉参与者如何在此模式中合作 ↩︎
结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎
实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎
范例代码:提供代码的片段 ↩︎
已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎
相关模式:描述了此模式和其他模式之间的关系 ↩︎