一、概述
本文主要介绍常见的单例模式和工厂模式,主要参考网址:https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md
与程杰电子书《大话设计模式》进行归纳总结。
其中页码为程杰电子书《大话设计模式》中对应的页码,粘贴的图片为加深理解提供帮助。
设计模式不是代码,而是解决问题的方案,学习现有的设计模式可以做到经验复用。
二、单例模式(P239)
意图
确保一个类只有一个实例,并提供了一个全局访问点。
类图
使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。
私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。
实现
懒汉式-线程不安全
以下实现中,私有静态变量 uniqueInstance 被延迟化实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 uniqueInstance,从而节约资源。
这个实现在多线程环境下是不安全的,如果多个线程能够同时进入if(uniqueInstance == null) ,那么就会多次实例化 uniqueInstance。
publicclassSingleton {
privatestatic Singleton uniqueInstance;
privateSingleton() {
}
publicstatic Singleton getUniqueInstance() {
if (uniqueInstance ==null) {
uniqueInstance =new Singleton();
}
return uniqueInstance;
}
}
懒汉式-线程安全
只需要对 getUniqueInstance()方法加锁,那么在一个时间点只能有一个线程能够进入该方法,从而避免了对 uniqueInstance 进行多次实例化的问题。
但是这样有一个问题,就是当一个线程进入该方法之后,其它线程试图进入该方法都必须等待,因此性能上有一定的损耗。
publicstaticsynchronized Singleton getUniqueInstance() {
if (uniqueInstance ==null) {
uniqueInstance =new Singleton();
}
retu