Singleton(单件)

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


  1. 模式分类归属 ↩︎

  2. 意图:描述该模式的作用,以及该模式的定义 ↩︎

  3. 动机:给出了问题以及如何解决这个问题的具体场景 ↩︎

  4. 适用性:描述模式可以被应用在什么场合 ↩︎

  5. 结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎

  6. 参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎

  7. 协作 :告诉参与者如何在此模式中合作 ↩︎

  8. 结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎

  9. 实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎

  10. 范例代码:提供代码的片段 ↩︎

  11. 已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎

  12. 相关模式:描述了此模式和其他模式之间的关系 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值