- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C设计模式之抽象工厂模式
HYPERLINK /abcdwxc/archive/2007/08/29/874891.html 抽象工厂(Abstract Factory)
常规的对象创建方法:
//创建一个Road对象Road?road?=new?Road();
new 的问题:??? 实现依赖,不能应对“具体实例化类型”的变化。解决思路:??? 封装变化点-----哪里变化,封装哪里??? 潜台词: 如果没有变化,当然不需要额外的封装!工厂模式的缘起??? 变化点在“对象创建”,因此就封装“对象创建”??? 面向接口编程----依赖接口,而非依赖实现最简单的解决方法:
1?class?RoadFactory{2?public?static?Road?CreateRoad()3?{????????????????????????????????4???return?new?Road();???5?}6?}7?//创建一个Road对象8?Road?road=roadFactory.CreateRoad();
创建一系列相互依赖对象的创建工作:假设一个游戏开场景:我们需要构造道路、房屋、地道,从林...等等对象工厂方法如下:
?1?????class?RoadFactory?2?????{?3?????????public?static?Road?CreateRoad()?4?????????{?5?????????????return?new?Road();?6?????????}?7?????????public?static?Building?CreateBuilding()?8?????????{?9?????????????return?new?Building();10?????????}11?????????public?static?Tunnel?CreateTunnel()12?????????{13?????????????return?new?Tunnel();14?????????}15?????????public?static?Jungle?CreateJungle()16?????????{17?????????????return?new?Jungle();18?????????}19?????}
调用方式如下:
1?????????Road?road?=? RoadFactory.CreateRoad();3?????????Building?building?=?RoadFactory.CreateBuilding();4?????????Tunnel?tunnel?=?RoadFactory.CreateTunnel();5?????????Jungle?jungle?=?RoadFactory.CreateJungle();
如上可见简单工厂的问题:??? 不能应对不同系列对象的变化。比如有不同风格的场景---对应不同风格的道路,房屋、地道....如何解决:??? 使用面向对象的技术来封装变化点。动机(Motivate):??? 在软件系统中,经常面临着一系统相互依赖的对象的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作。??? 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种封装机制来避免客户程序和这种多系列具体对象创建工作的紧耦合?意图(Intent):??? 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。???????????????????????????????????????????? ??? ----《设计模式》GOF结构图(Struct):??????????? 适用性:??? 1.一个系统要独立于它的产品的创建、组合和表示时。??? 2.一个系统要由多个产品系统中的一个来配置时。??? 3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。??? 4.当你提供一个产品类库,而只想显示它们的接口不是实现时。生活例子:?????????????? 结构图代码实现:
1??abstract?class?AbstractFactory2?????{3????????public?abstract?AbstractProductA?CreateProductA();4????????public?abstract?AbstractProductB?CreateProductB();5?????}
1???abstract?class?AbstractProductA2?????{3????
文档评论(0)