23种设计模式.doc
上传人:qw****27 上传时间:2024-09-11 格式:DOC 页数:190 大小:3.7MB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

23种设计模式.doc

23种设计模式.doc

预览

免费试读已结束,剩余 180 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

创建型:HYPERLINK"http://www.cnblogs.com/abcdwxc/archive/2007/08/28/873342.html"单件模式(SingletonPattern)创建型模式---单件模式(SingletonPattern)动机(Motivation):在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。如何绕过常规的构造器,提供一种机制来保证一个类只创建一个实例?这应该是类设计者的责任,而不是类使用者的责任。结构图:意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。------<<设计模式>>GOF生活的例子:适用性:(1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。(2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。代码实现:(1)单线程Singleton实现classSingleThread_Singleton{privatestaticSingleThread_Singletoninstance=null;privateSingleThread_Singleton(){}publicstaticSingleThread_SingletonInstance{get{if(instance==null){instance=newSingleThread_Singleton();}returninstance;}}}以上代码在单线程情况下不会出现任何问题。但是在多线程的情况下却不是安全的。如两个线程同时运行到if(instance==null)判断是否被实例化,一个线程判断为True后,在进行创建instance=newSingleThread_Singleton();之前,另一个线程也判断(instance==null),结果也为True.这样就就违背了Singleton模式的原则(保证一个类仅有一个实例)。怎样在多线程情况下实现Singleton?(2)多线程Singleton实现:1classMultiThread_Singleton2{3privatestaticvolatileMultiThread_Singletoninstance=null;4privatestaticobjectlockHelper=newobject();5privateMultiThread_Singleton(){}6publicstaticMultiThread_SingletonInstance7{8get9{10if(instance==null)11{12lock(lockHelper)13{14if(instance==null)15{16instance=newMultiThread_Singleton();17}18}19}20returninstance;21}22}23此程序对多线程是安全的,使用了一个辅助对象lockHelper,保证只有一个线程创建实例(如果instance为空,保证只有一个线程instance=newMultiThread_Singleton();创建唯一的一个实例)。(DoubleCheck)请注意一个关键字volatile,如果去掉这个关键字,还是有可能发生线程不是安全的。volatile保证严格意义的多线程编译器在代码编译时对指令不进行微调。(3)静态Singleton实现3classStatic_Singleton4{5publicstaticreadonlyStatic_Singletoninstance=newStatic_Singleton();6privateStatic_Singleton(){}7}以上代码展开等同于1classStatic_Singleton2{3publicstaticreadonlyStatic_Singletoninstance;4staticStatic_Singleton()5{6instance=newStatic_Singleton();7}8privateStatic_Singleton(){}9}由此可以看出,完全符合Singleton的原则。优点:简洁,易懂缺点:不可以实现带参数实例的创建。(注:以上代码及信息借鉴于李建忠老师的MSDN和TerryLee的文章。)HYPERLINK"http://www.cnblogs.com/abcdwxc/archive/2007/08/29/874891.html"抽象工厂(AbstractFactory)常规的对象创建方法://创建一个Road对象Roadroad=newRoad();new的问题