设计模式之单例模式

本文介绍了单例模式的定义、特点,包括减少内存开销、全局资源管理和缺点如扩展困难及测试问题。详细讲解了饿汉式、懒汉式和线程安全的单例实现方法。
摘要由CSDN通过智能技术生成

单例模式

定义

Singleton Design Pattern
Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的(在Singleton中自己使用new Singleton())。

  1. 全局唯一
  2. 处理资源访问冲突

单例模式通用类

public class Singleton {
	private static final Singleton INSTANCE = new Singleton();
	// 防止产生多个对象
	private Singleton() {
	}
	// 通过该方法生成实例对象
	public static Singleton getInstance() {
		return INSTANCE;
	}
	// 尽量是static
	public static void doSomething() {
	}
}

特点

  1. 减少内存开销,不用频繁地创建、销毁,而且创建或销毁时性能又无法优化;
  2. 只有一个实例对象,减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决;
  3. 可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作;
  4. 可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

缺点

  1. 一般没有接口,扩展很困难
  2. 单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能使用mock的方式虚拟一个对象。
  3. 单例模式与单一职责原则有冲突。一个类应该只实现一个逻辑,而不关心它是否是单例的,是不是要单例取决于环境,单例模式把“要单例”和业务逻辑融合在一个类中。

几种单例代码

  1. 饿汉式
public class Singleton {
	private static Singleton instance = new Singleton();
	private Singleton() {
	}
	private static Singleton getInstance() {
	}
}
  1. 懒汉式
public class Singleton {
	private static Singleton instance = new Singleton();
	private Singleton() {
	}
	private static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}
public class Singleton {
	private static Singleton instance; 
	private Singleton (){
	}
	public synchronized static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton(); 
		}
		return instance; 
	}
}
public class Singleton {
	private volatile static Singleton instance; 
	private Singleton (){
	}
	public synchronized static Singleton getInstance() {
	  if (instance == null) {
			synchronized(Singleton.class) {
				if (instance == null) {
					instance = new Singleton(); 
				}
			}
		}
		return instance; 
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游侠小马哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值