欢迎来到天天文库
浏览记录
ID:40295302
大小:49.50 KB
页数:4页
时间:2019-07-30
《C#设计模式 之 单件模式》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、单件模式(SingletonPattern)创建型模式---单件模式(SingletonPattern)动机(Motivation): 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器,提供一种机制来保证一个类只创建一个实例? 这应该是类设计者的责任,而不是类使用者的责任。结构图: 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 ------<<设计模式>>GOF生活的例
2、子: 适用性: (1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 (2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。代码实现:(1)单线程Singleton实现 class SingleThread_Singleton { private static SingleThread_Singleton instance = null; private SingleThread_Singleton(){}
3、public static SingleThread_Singleton Instance { get { if (instance == null) { instance = new SingleThread_Singleton(); } return instance; } } }以上
4、代码在单线程情况下不会出现任何问题。但是在多线程的情况下却不是安全的。如两个线程同时运行到if (instance == null)判断是否被实例化,一个线程判断为True后,在进行创建 instance = new SingleThread_Singleton();之前,另一个线程也判断(instance == null),结果也为True.这样就就违背了Singleton模式的原则(保证一个类仅有一个实例)。怎样在多线程情况下实现Singleton?(2)多线程Singleton实现: 1 class MultiThread_Sin
5、gleton 2 { 3 private static volatile MultiThread_Singleton instance = null; 4 private static object lockHelper = new object(); 5 private MultiThread_Singleton() { } 6 public static MultiThread_Singleton Instance 7 { 8 get 9
6、 {10 if (instance == null)11 {12 lock (lockHelper)13 {14 if (instance == null)15 {16 instance = new MultiThread_Singleton();17
7、 }18 }19 }20 return instance;21 } 22 }23 此程序对多线程是安全的,使用了一个辅助对象lockHelper,保证只有一个线程创建实例(如果instance为空,保证只有一个线程instance = new MultiThread_Singleton();创建唯一的一个实例)。(DoubleCheck)请注意一个关键字volatile,如果
8、去掉这个关键字,还是有可能发生线程不是安全的。volatile保证严格意义的多线程编译器在代码编译时对指令不进行微调。(3)静态Singleton实现3
此文档下载收益归作者所有