C#设计模式 之 单件模式.doc_第1页
C#设计模式 之 单件模式.doc_第2页
C#设计模式 之 单件模式.doc_第3页
C#设计模式 之 单件模式.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单件模式(Singleton Pattern) 创建型模式-单件模式(Singleton Pattern)动机(Motivation): 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器,提供一种机制来保证一个类只创建一个实例? 这应该是类设计者的责任,而不是类使用者的责任。结构图: 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 -GOF生活的例子: 适用性: (1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 (2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。代码实现:(1)单线程Singleton实现 classSingleThread_SingletonprivatestaticSingleThread_Singletoninstance=null;privateSingleThread_Singleton()publicstaticSingleThread_SingletonInstancegetif(instance=null)instance=newSingleThread_Singleton();returninstance;以上代码在单线程情况下不会出现任何问题。但是在多线程的情况下却不是安全的。如两个线程同时运行到 if(instance=null)判断是否被实例化,一个线程判断为True后,在进行创建instance=newSingleThread_Singleton();之前,另一个线程也判断(instance=null),结果也为True.这样就就违背了Singleton模式的原则(保证一个类仅有一个实例)。怎样在多线程情况下实现Singleton?(2)多线程Singleton实现:1classMultiThread_Singleton23privatestaticvolatileMultiThread_Singletoninstance=null;4privatestaticobjectlockHelper=newobject();5privateMultiThread_Singleton()6publicstaticMultiThread_SingletonInstance78get910if(instance=null)1112lock(lockHelper)1314if(instance=null)1516instance=newMultiThread_Singleton();17181920returninstance;212223 此程序对多线程是安全的,使用了一个辅助对象lockHelper,保证只有一个线程创建实例(如果instance为空,保证只有一个线程instance=newMultiThread_Singleton();创建唯一的一个实例)。(Double Check)请注意一个关键字volatile,如果去掉这个关键字,还是有可能发生线程不是安全的。volatile 保证严格意义的多线程编译器在代码编译时对指令不进行微调。(3)静态Singleton实现3classStatic_Singleton45 public staticreadonlyStatic_Singletoninstance=newStatic_Singleton();6privateStatic_Singleton()7以上代码展开等同于1classStatic_Singleton23 public staticreadonlyStatic_Singletoninstance;4staticStatic_Singleton()56instance=newStatic_Singleton();78privateStatic_Singleton()9由此

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论