设计模式01 创建型模式 - 单例模式(Singleton Pattern)

参考

[1] 设计模式之:创建型设计模式(6种) | 博客园

[2] 单例模式的八种写法比较 | 博客园

单例模式(Singleton  Pattern)

确保一个类有且仅有一个实例,并且为客户提供一个全局访问点。

特点

1) 保证被访问资源对象在内存中只有一个实例,节约了系统内存资源,也避免了对资源多重占用;

2) 封装了访问实例方法,提供全局访问点,严格控制客户的访问方式;

3) 通常常驻内存,不会频繁创建/销毁,节约了系统开销;

缺点

1) 没有抽象层,难以扩展;

2) 类的职责过重,往往一个单例负责所有与之相关功能,违背了类设计的“职责单一”原则;

3) 单例如果持有context,容易造成内存泄漏;

4) 全局共享一个实例资源,难以隔离问题,进行单独测试;

适用场景

1)全局随时可能需要访问,访问方式复杂,而且资源受限;

2)需要常驻内存,避免频繁创建、销毁的资源;

demo

单例模式通用UML类图

 

单例模式的8种写法与多线程

单例模式为了不让外部随意构建实例,一般需要将构造函数声明为private,在获取实例对象时,就无法通过动态函数来读取(因为此时实例还未初始化),故只能通过类方法(static方法)来获取实例引用。

 1. 饿汉式 静态常量

//饿汉式 静态常量
public class Singleton {
	private final static Singleton INSTANCE = new Singleton();
	
	private Singleton()	{	}
	public static Singleton getInstance() { return INSTANCE; }
	
	public void displaySingleton(){
		System.out.println("This is a Singleton.");
	}

}

特点:简单,类装载时完成初始化,不存在多线程同步问题;

优点:没有延迟实例化,如果程序一直没有使用,会造成资源浪费;

2.饿汉式 静态代码块

与饿汉式 静态常量类似,只是把实例初始化放在了类的静态代码块中,而非放在实例引用定义处。

// 饿汉式 静态代码块
public class Singleton1 {
	private static Singleton1 instance;
	
	static{
		instance = new Singleton1();
	}
	
	private Singleton1(){}
	
	public static Singleton1 getInstance(){
		return instance;
	}
	
	public void displaySingleton(){
		System.out.println("单例初始化方式: 饿汉式 静态代码块");
	}
}

  

总结

猜你喜欢

转载自www.cnblogs.com/fortunely/p/9785794.html