经典文档-C#23种设计模式.pdf
《经典文档-C#23种设计模式.pdf》由会员分享,可在线阅读,更多相关《经典文档-C#23种设计模式.pdf(241页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、c#23种设计模式China Document 4 Colors1.1 节 工 期How are you1.1.1 完成日期1.2 节 创 建 型 模 式1.21 单件模式(Singleton Pattern)动 机(M otiva tion):在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。如何绕过常规的构造器,提供一种机制来保证一个类只创建一个实例?这应该是类设计者的责任,而不是类使用者的责任。结构图:意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。-GOF生活的例子:返回唯一实例适用性:(1)当类只能有一个实
2、例而且客户可以从一个众所周知的访问点访问它时。(2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。代码实现:(1)单线程S ingleton实现class SingleThread_Singleton(private static SingleThread_Singleton instance=null;private SingleThread_Singleton()public static SingleThread_Singleton I nstance(get(if(instance=null)(instance=new SingleThrea
3、d_Singleton();)return instance;)以上代码在单线程情况下不会出现任何问题。但是在多线程的情况下却不是安全的。如两个线程同时运行到if(instance=null)判断是否被实例化,一个线程判断为True后,在进行创建instance=new SingleThread_Singleton();之前,另一个线程也判断(instance=n u ll),结果也为 True.这样就就违背了 Singleton模式的原则(保证一个类仅有一个实例)。怎样在多线程情况下实现Singleton?(2)多 线 程Singleton实现:1 class MultiThread_Sin
4、gleton2 3 private static volatile MultiThread_Singleton instance=null;4 private static object lockHelper=new object();5 private MultiThread_Singleton()6 public static MultiThread_Singleton Instance7(8 get9(10 if(instance=null)11(1 2 lock(lockHelper)13 14 if(instance=null)15 1 6 instance=new MultiThr
5、ead_Singleton();17)18)19)20 return instance;21)22)23此程序对多线程是安全的,使用了一个辅助对象lockHelper,保证只有一个线程创建实例(如果 instance 为空,保证只 有 一 -个线程 instance=new MultiThread_Singleton();创建唯一的一个实例)。(Double Check)请注意一个关键字volatile,如果去掉这个关键字,还是有可能发生线程不是安全的。volatile保证严格意义的多线程编译器在代码编译时对指令不进行微调。(3)静态S ingleton实现3 class Static_Sin
6、gleton4(5 publicstatic readonly Static_Singleton instance=new Static_Singleton();6 private Static_Singleton()7)DirectorBuilderO+Construct()-BuildPart)一Fetch Item In Structurebuild.BuildPanOConcreteBuilder-BuildPartf)-GctRcsultOC ollaborations):aClientaDirectoraConcreteBuilder生活中的例子:M赛工厂”3)适用性:1.当创建复
7、杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。2.当构造过程必须允许被构造的对象有不同的表示时。实例代码:Builder 类:1 public abstract class Builder2(3 public abstract void BuildDoor();4 public abstract void BuildWall();5 public abstract void BuildWindows();6 public abstract void BuildFloor();7 public abstract void BuildHouseCeiling();89 public
8、abstract House GetHouse();10)Director类:这一部分是 组合到一起的算法(相对稳定)。1 public class Director2(3 public void Construct(Builder builder)4(5 builder.BuildWall();6 builder.BuildHouseCeiling();7 builder.BuildDoor();8 builder.BuildWindows();9 builder.BuildFloor();10)11)ChineseBuilder 类1 public class ChineseBuilder
9、:Builder2(3 private House ChineseHouse=new House();4 public override void BuildDoor()5 6Console.WriteLine(this Doors style of Chinese);7 8 public override void BuildWall()9 1 0 Console.WriteLine(this Walls style of Chinese);11)1 2 public override void BuildWindows()13 14 Console.WriteLine(this Windo
10、wss style of Chinese);15)1 6 public override void BuildFloor()17 1 8 Console.WriteLine(this Roor s style of Chinese11);19)20 public override void BuildHouseCeiling()21 22 Console.WriteLine(this Ceilings style of Chinese);23)24 public override House GetHouse()25 26 return ChineseHouse;27)28)RomanBuil
11、der 类:1 class RomanBuilder:Builder2(3 private House RomanHouse=new House();4 public override void BuildDoor()5 6 Console.WriteLine(this Doors style of Roman);7)8 public override void BuildWall()9 10 Console.WriteLine(this Walls style of Roman);11)1 2 public override void BuildWindows()13 14 Console.
12、WriteLine(this Windowss style of Roman);15)1 6 public override void BuildFloor()17 18 Console.WriteLine(this Floor s style of Roman);19)20 public override void BuildHouseCeiling()21 Console.WriteLine(this Ceilings style of Roman);23)24 public override House GetHouse()25 26 return RomanHouse;27)28)Ch
13、ineseBuilder利RomanBuilder这 两 个 是:这个复杂对象的两个部分经常面临着剧烈的变化。1 public class Client2(3 public static void Main(string args)4 5 Director director=new Director();67 Builder instance;89 Console.WriteLine(Please Enter House No:);1011 string No=Console.ReadLine();1213 string houseType=Configurationsettings.AppS
14、ettingsHNoH+No;1415 instance=(Builder)Assem bly.Load(House).Createlnstance(House.+houseType);161 7 director.Construct(instance);1819 House house=instance.GetHouse();20 house.Show();2122 Console.ReadLine();23)24)1 2 3 4 5 6 7 B uilder模式的几个要点:B uilder模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的乘法,而复杂对象的各个部分则经
15、常变化。B uilder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。Abstract Factory模式解决“系列对象”的需求变化,B uilder模式解决“对象部分”的需求变化。Builder械通常和Composite模式组合使用1.24 工厂方法模式(Factory Method)耦合关系:耦合关系直接决定着软件面对变化时的行为-模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之更改-模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其他模块保持不变动机(M otivation):在软件系统中,由于需
16、求的变化,这个对象的具体实现 经常面临着剧烈的变化,但它却有比较稳定的接口。如何应对这种变化呢?提供一种封装机制来隔离出“这个易变对象 的变化,从而保持系统中其它依赖的对象”不随需求的变化而变化。意图(I ntent):定义一个用户创建对象的接口,让子类决定实例哪一个类。Factory Method使 个 类 的 实例化延迟到子类。.设计模式GOF结构图(S truct):生活实例:注入S B造SA 0玩具马模具适用性:1.当一个类不知道它所必须创建的对象类的时候。2 当一个类希望由它子类来指定它所创建对象的时候。3.当类将创建对象的职责委托给多个帮助子类中的某个,并且你希望将哪一个帮助子类是
17、代理者这一信息局部化的时候。实例代码:CarFactory 类:1 public abstract class CarFactory2 3 public abstract Car CarCreate();4)Car 类:1 public abstract class Car2 3 public abstract void StartUpO;4 public abstract void Run();5 public abstract void Stop();67)HongQiCarFactory 类:1 public class HongQiCarFactory:CarFactory2 3pub
18、lic override Car CarCreate()4(5 return new HongQiCar();6)7)BMWCarFactory 类:1 public class BMWCarFactory:Car Factory2 3 public override Car CarCreate()4(5 return new BMWCar();6)7)HongQiCar 类:1 public class HongQiCar:Car2 3 public override void StartUp()4 5 Console.WriteLine(Test HongQiCar start-up sp
19、eed!);6)7 public override void Run()8 9 Console.WriteLine(The HongQiCar run is very quickly!);10)11 public override void Stop()12 13 Console.WriteLine(The slow stop time is 3 second);14)15 BMWCar 类:1 public class BMWCar:Car2(3 public override void StartUp()45Console.WriteLine(HThe BMWCar start-up sp
20、eed is very quickly);6)7 public override void Run()8(9 Console.WriteLine(The BMWCar run is quitely fast and safe!);10)11 public override void Stop()12 13 Con sole.WriteLine(The slow stop time is 2 second);14)15)app.config1 2 3 4 5 6 7 Program 类:1 class Program2 3 static void Main(string args)4 5 Con
21、sole.WriteLine(nPlease Enter Factory Method No:);6 Console.WriteLine(n*);7 Console.WriteLine(HnoConsole.WriteLine(n19 Console.WriteLine(210 Console.WriteLine(n*11 int no=I nt32.Parse(Co12 string factoryType=Co13/CarFactory factory=14 CarFactory factory=(Factory Method);HongQi CarFactory);BMWCarFacto
22、ry);it*nsole.ReadLine().ToString();nfigurationManager.AppSettingsNonew HongQiCarFactory();Ca r Fact o ry)Asse m bl y.Lo ad(Fact oryM(eatelnstance(FactoryMehtod.+factoryType);15 Car car=factory.CarCreate();16 car.StartUp();17 car.Run();18 car.Stop();1920)21)Factory M ethod模式的几个要点:Factory Method模式主要用于
23、隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。Factory Mehtod模式解决“单个对象”的需求变化,AbstractFactory模式解决“系歹U对象”的需求变化,Builder模式解决,对象部分”的需求变化1.25 原型模式(Prototype)依赖关系倒置:抽象不应该依赖于实现细节,实现细节应该依赖于抽象。-抽象A直接依赖于实现细节b-抽象A依赖于抽象B,实现细节b依赖于抽象BI-
24、777)抽象A 实现细节b抽象B实现细节b动机(Motivate):在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。如何应对这种变化?如何向“客户程序(使用这些对象的程序)隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?意图(I nt e nt):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。-设计模式G O F结构图(S t r u c t):生活例子:适用性:1.当一个系统应该独立于它的产品创建,构成和表示时;2.当要实例化的类是在运行时刻指定时,
25、例如,通过动态装载;3.为了避免创建一个与产品类层次平行的工厂类层次时;4 .当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。示意性代码例子:1 public abstract class NormalActor2 3 public abstract NormalActor clone();4)1 public class NormalActorA:NormalActor2(3 public override NormalActor clone()4 5 Console.WriteLine(NormalActorA i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 经典 文档 C# 23 设计 模式
限制150内