设计模式之单例模式

单例模式

定义

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; 
	}
}

你可能感兴趣的:(设计模式,单例模式,设计模式)