C设计模式之抽象工厂模式.doc
文本预览下载声明
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????
显示全部