经典文档-C#23种设计模式.docx
《经典文档-C#23种设计模式.docx》由会员分享,可在线阅读,更多相关《经典文档-C#23种设计模式.docx(260页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、c#23种设计模式China Document 4 Colors1.1 节工期How are you1.1.1 完成日期1.2 节创建型模式1.21 单件模式(Singleton Pattern)动机(Motivation):在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。如何绕过常规的构造器,提供一种机制来保证一个类只创建一个实例?这应该是类设计者的责任,而不是类使用者的责任。结构图:return untquelnsianceSingletonstatic InstanceO o- SingletonOperatkn() G
2、etSingletonData()static uniqueinstance singletonDala意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。305生活的例子:2T n-i j/i适用性:(1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。(2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。代码实现:(1)单线程Singleton实现class SingleThread_Singletonprivate static SingleThread_Singleton instance = null;private S
3、ingleThread_Singleton()public static SingleThread_Singleton Instance( get (if (instance = null)(instance = new SingleThread_Singleton(); return instance;)1)以上代码在单线程情况下不会出现任何问题。但是在多线程的情况下却不是安全的。如两个线程同时运行到if (instance = null)判断是否被实例化,一个线程判断为True后,在进行创建instance = new SingleThread_Singleton();之前,另一个线程也判
4、断(instance = null),结果也为 True.这样就就违背了 Singleton模式的原则(保证一个类仅有一个实例)。怎样在多线程情况下实现Singleton?(2)多线程Singleton实现:1 class MultiThread_Singleton2 (3 private static volatile MultiThread_Singleton instance = null;4 private static object lockHelper = new object();5 private MultiThread_Singleton()6 public static M
5、ultiThread_Singleton Instance7 (8 get9 10 if (instance = null)11 12 lock (lockHelper)13 14 if(instance=null)15 16 instance = new MultiThread_Singleton();17 )18 )19 )20 returninstance;21 22 )23此程序对多线程是安全的,使用了一个辅助对象lockHelper,保证只有一个线程创建实例(如果 instance 为空,保证只有一个线程 instance = new MultiThread_Singleton();
6、创建唯一的一个实例)。(Double Check)请注意一个关键字volatile,如果去掉这个关键字,还是有可能发生线程不是安全的。volatile保证严格意义的多线程编译器在代码编译时对指令不进行微调。(3)静态Singleton实现3 class Static_Singleton4 (5 publicstatic readonly Static_Singleton instance = new Static_Singleton();6 private Static_Singleton()aConcreteBuilder pBuiWPar1A(yBuiUPadBODuildParlCOGe
7、tResultOT协作(Collaborations):aClientaDirectorXJnew ConcreteBuilder i阳w Oreclor(aConcreleBulder)ConstrucK)生活中的例子:适用性:1 .当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。2 .当构造过程必须允许被构造的对象有不同的表示时。实例代码:Builder 类:1 public abstract class Builder2 (3 publicabstractvoidBuildDoor();4 publicabstractvoidBuildWall();5 publica
8、bstractvoidBuildWindows();6 publicabstractvoidBuildFloor();7 publicabstractvoidBuildHouseCeiling();89 public abstract House GetHouse();10 )Director类:这一部分是组合到一起的算法(相对稳定)。1 public class Director2 3 public void Construct(Builder builder)4 (5 builder.BuildWall();6 builder.BuildHouseCeiling();7 builder.B
9、uildDoor();8 builder.BuildWindows();9 builder.BuildRoor();10 )11 ChineseBuilder 类1 public class ChineseBuilder:Builder2 (3 private House ChineseHouse = new House();4 public override void BuildDoor()Con sole. WriteLine(this Door *s style of Chinese);7 8 publicoverride void BuildWall()9 10 Console.Wri
10、teLine(this Walls style of Chinese);11 )12 publicoverride void BuildWindows()13 14 Console.WriteLine(nthis Windowss style of Chinese);15 )16 publicoverridevoidBuildFloor()17 18 Console.WriteLine(this Floors style of Chinese*);19 )20 publicoverridevoidBuildHouseCeiling()21 22 Console.WriteLine(this C
11、eiling *s style of Chinese);23 )24 public override House GetHouse()25 26 return ChineseHouse;27 )28 )RomanBuilder 类:1 class RomanBuilder:Builder2 (private House RomanHouse = new House();4 publicoverridevoidBuildDoor()5 6 Con sole. WriteLine(nthis Doors style of Roman);7 8 publicoverridevoidBuildWall
12、()9 10 Consol e.WriteLine(this Walls style of Rom anH);12 public override void BuildWindows()13 14 Console.WriteLine(this Windowss style of Roman);15 )16 public override voidBuildRoor()17 18 Console.WriteLine(Hthis Floors style of Roman*);19 20 public override voidBuildHouseCeiling()21 22 Console.Wr
13、iteLine(nthis Ceiling *s style of Roman,);23 24 public override House GetHouse()25 26 return RomanHouse;27 )28 )ChineseBuilder和Roman Builder这两个是:这个复杂对象的两个部分经常面临着剧烈的变化。1 public class Client2 (3 public static void Main(string args)4 5 Director director = new Director();67 Builder instance;89 Console.W
14、riteLine(nRease Enter HouseNo:);1011 string No = Console.ReadLine();1213 string houseType = ConfigurationSettings.AppSettingsfNo+ No;15instance =(Builder) Assem bly.Load(HouseH).Createl nstance(MHouse.+ houseType);1617 director.Construct(instance);1819House house= instance.GetHouse();20house.Show();
15、2122Console.ReadLinef);23)24)1 2 3 4 5 6 7 Builder模式的几个要点:Builder模式主要用于“分步骤构建个复杂的对象”。在这其中“分步骤”是一个稳定的乘法,而复杂对象的各个部分则经常变化。Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。Abstract Factory模式解决“系列对象的需求变化,Builder模式解决“对象部分”的需求变化。Builder械通常和Composite模式组合使用1.24工厂方法模式(Factory Method)耦合关系:耦合关系直接决定着软件面对
16、变化时的行为-模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之更改-模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其他模块保持不变动机(Motivation):在软件系统中,由于需求的变化,”这个对象的具体实现经常面临着剧烈的变化,但它却有比较稳定的接口。如何应对这种变化呢?提供一种封装机制来隔离出这个易变对象”的变化,从而保持系统中其它依赖的对象不随需求的变化而变化。意图(I ntent):定义一个用户创建对象的接口,让子类决定实例哪一个类。Factory Method使一个类的实例化延迟到子类。设计模式GOF结构图(Struct):生活实例:适用性:
17、1 .当一个类不知道它所必须创建的对象类的时候。2 .当一个类希望由它子类来指定它所创建对象的时候。个帮助子类是代3 .当类将创建对象的职责委托给多个帮助子类中的某个,并且你希望将哪理者这一信息局部化的时候。实例代码:CarFactory 类:1 public abstract class CarFactory2 (3 public abstract Car CarCreate();4 )Car 类:1 public abstract class Car2 3 public abstractvoidStartUp();4 public abstractvoidRun();5 public ab
18、stractvoidStop();67 )HongQi Car Factory 类:1 public class HongQiCarFactory:CarFactory3 publicoverride Car CarCreate()4 5 return new HongQiCar();6 )7 )BMWCarFactory 类:1 public class BMWCarFactory :CarFactory2 3 publicoverride Car CarCreate()4 (5 return new BMWCar();6 )7 HongQiCar 类:1 public class Hong
19、QiCar:Car2 3 publicoverridevoidStartUp()4 (Console.WriteLine(Test HongQiCar start-up speed!);6 7 publicoverridevoidRun()8 (9 Console.WriteLine(MThe HongQiCar run is very quickly!*);10 11 public override void Stop()12 13 Console.WriteLine(MThe slow stop time is 3 second M);14 )15 )BMWCar 类:1 public c
20、lass BMWCar:Car2 3 public override void StartUp()Console.WriteLine(The BMWCar start-up speed is very quickly,);6 )7 publicoverride void Run()8 (9 Console.WriteLine(The BMWCar run is quitely fast and safe!*);10 )11 public override void Stop()12 13 Console.WriteLine(HThe slow stop time is 2 second);14
21、 )15 ) app.config123456 7 Program 类:1 class Programstatic void Main(string args)Console.WriteLine(HPlease Enter Factory Method No:);Console.WriteLine(,*Con sole. WriteLine(HnoFactory Method);Con sole. WriteLine(H1HongQi CarFactory);Con sole. WriteLine(2BMWCarFactory);10Console.WriteLine(H* * * *);11
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 经典 文档 C# 23 设计 模式
限制150内