接触编程语言之初就听说过设计模式,但直到现在都不知道该怎样用,适用哪些场合,只是了解少部分概念,以应付面试。
这段时间,赶项目的同时,每天抽一段时间来系统学下设计模式,总结各路技术大牛的经验加上自己的理解,用博文的方式记录下来。
其实,设计模式并非一种技术或者框架,更应该理解为前辈在探索路上总结的方法(思想),先从简单的学起。
废话说完,进入正题,走你...
单例模式【官方定义】:确保一个类只有一个实例,并提供一个全局访问点
根据定义,很容易得到单例模式的经典代码:
public sealed class Singleton
{
//私有构造方法,外界不能用New 创建实例
private Singleton()
{
}
//私有变量保存类的实例
private static Singleton instance;
//全局访问点
//线程不安全,多个线程同时访问GetInstance会冲突
public static Singleton GetInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
如果多个线程同时获取对象,理想状态下每个线程都会创建一个实例,就违背单例模式的初衷了,
改进如下,加一个控制线程的锁标识:
public sealed class Singleton
{
//私有构造方法,外界不能用New 创建实例
private Singleton()
{
}
//私有变量保存类的实例
//private static Singleton instance;
//2016-1-25更新:为了保证多线程的情况下,每次读取instance都从内存而不是从cache中读取。换句话说,保证变量是最新的,不受其他子线程影响,应该这样定义,使用volatile关键字
private static volatile Singleton instance; //定义一个标识,确保线程同步
private static readonly object lockHelper = new object(); //全局访问点
//线程不安全,多个线程同时访问GetInstance会冲突
public static Singleton GetInstance()
{
//线程第一次跑到这里,锁住
lock (lockHelper)
{
if (instance == null)
{
instance = new Singleton();
}
}
return instance;
}
}
在高级语言里,可以归纳为:
public class Singleton
{
private Singleton(){}
public static readonly Singleton instance = new Singleton();
}
接下来简单说说单例模式的适用范围(个人理解),
①一个项目中需要对同一个大类多次实例化并销毁,比如操作系统的任务管理器,只能打开一个。
②资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
③控制资源的情况下,方便资源之间的互相通信。如线程池等
这样做的好处就是不用为每次实例化分配内存空间,某种程度上节省了开销。