C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型
一、引言
??? 如何应对这种变化?如何提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖对象的对象”不随着需求改变而改变? 2 namespace 设计模式之工厂方法模式 3 { 4 /// <summary> 5 /// 汽车抽象类 6 </summary> 7 public abstract class Car 8 { 9 // 开始行驶 10 void Go(); 11 } 12 13 14 红旗汽车 15 16 HongQiCar : Car 17 18 override Go() 19 { 20 Console.WriteLine("红旗汽车开始行驶了!"); 21 } 22 23 24 25 奥迪汽车 26 27 AoDiCar : Car 28 29 30 31 Console.WriteLine("奥迪汽车开始行驶了32 33 34 35 36 抽象工厂类 37 38 Factory 39 40 工厂方法 41 abstract Car CreateCar(); 42 43 44 45 红旗汽车工厂类 46 47 HongQiCarFactory:Factory 48 49 50 负责生产红旗汽车 51 52 <returns></returns> 53 override Car CreateCar() 54 55 return new HongQiCar(); 56 57 58 59 60 奥迪汽车工厂类 61 62 AoDiCarFactory:Factory 63 64 65 负责创建奥迪汽车 66 67 68 Car CreateCar() 69 70 AoDiCar(); 71 72 73 74 75 客户端调用 76 77 Client 78 79 static void Main(string[] args) 80 81 初始化创建汽车的两个工厂 82 Factory hongQiCarFactory = HongQiCarFactory(); 83 Factory aoDiCarFactory = AoDiCarFactory(); 84 85 生产一辆红旗汽车 86 Car hongQi = hongQiCarFactory.CreateCar(); 87 hongQi.Go(); 88 89 生产一辆奥迪汽车 90 Car aoDi = aoDiCarFactory.Create91 aoDi.Go(); 92 93 Console.Read(); 94 95 } 96 } ??? 在【工厂方法模式】中,我们同样也把汽车的类抽象出来一个抽象的基类,这里正好符合了【面向抽象编程】,客户端在使用的时候不会依赖具体的什么汽车。使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。例如,我们想增加一辆奔驰车,我们只需从Car抽象类下继承一个BenChiCar类,同时在从Factory抽象基类下继承一个“奔驰”的工厂类BenChinaCarFactory就可以了,这样扩展符合OCP的原则。具体代码为: 1 2 奔驰车 3 4 BenChiCar : Car 5 6 7 重写抽象类中的方法 8 10 11 Console.WriteLine(奔驰车开始行驶了!12 13 14 16 奔驰车的工厂类 17 18 BenChiCarFactory : Factory 20 21 负责生产奔驰车 22 23 24 25 26 BenChiCar(); 27 29 30 31 32 33 34 35 36 37 38 如果客户又生产一辆奔驰车 39 再另外初始化一个奔驰车的工厂 40 Factory benChiCarFactory = BenChiCarFactory(); 41 42 利用奔驰车的工厂生产奔驰车 43 Car benChi = benChiCarFactory.Create44 benChi.Go(); 45 46 47 49
Factory Method模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。 Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。 ????? Factory Method模式解决“单个对象”的需求变化; ????? AbstractFactory模式解决“系列对象”的需求变化; ????? Builder模式解决“对象部分”的需求变化; <add path=*.axd" verb=*" type=System.Web.HttpNotFoundHandler" validate=True"/> <add path=*.aspxSystem.Web.UI.PageHandlerFactory"/> <add path=*.ashxSystem.Web.UI.SimpleHandlerFactory"/> 配置文件截图了一部分,有时间大家可以自己去研究一下。 五、总结 ?????? 每种模式都有自己的使用场合,切记,如果使用错误,还不如不用。工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,从而解决了简单工厂模式中存在的问题,也很好地符合了开放封闭原则(即对扩展开发,对修改封闭)。 学习设计模式我们一定要谨记设计模式的几大原则,否则是徒劳无功的。就像学务工一样,我们要记心法。6大原则就像孤独求败的独孤九剑的剑诀,学会了,变化无穷。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |