LoveUnix » 行业应用 项目实施 » [设计模式讨论之]abstract factory抽象工厂
让LU留住您的每

一天 让LU博客留住您的每一天
2003-11-17 23:48 无双
意图 <br /><br />提供一个创建一系列相关或相互依赖对象的接口而无须指定它们的类<br /><br />例子<br />还是书上的<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />class MazeFactory{<br />public&#58;<br /> &nbsp; MazeFactory&#40;&#41;;<br /> &nbsp; virtual Maze* MakeMaze&#40;&#41; const{<br /> &nbsp; &nbsp; return new Maze;<br /> &nbsp; }<br /> &nbsp; virtual Wall* MakeWall&#40;&#41; const{ <br /> &nbsp; &nbsp; return new Wall;<br /> &nbsp; }<br /> &nbsp; virtual Room* MakeRoom&#40;int n&#41;{<br /> &nbsp; &nbsp; return new Room&#40;n&#41;;<br /> &nbsp; }<br /> &nbsp; virtual Door* MakeDoor&#40;Room* r1,Room* r2&#41;{<br /> &nbsp; &nbsp; return new Door&#40;r1,r2&#41;;<br /> &nbsp; }<br />};<br /><!--c2--></div><!--ec2--><br /><br />上面的MazeFactory{类提供了四个接口<br />这四个接口分别用于创建四个相关联类型的对象 Maze Wall Room Door,<br />当其它对象调用这四个对象时 只要调用MazeFactory类中对应的接口就可以了<br />而不必指明需要哪个具体的类进行创建<br /><br />这样 你可以定义四个抽象基类做为接口的返回值<br />在接口的实现中定义具体实现的类 如跨平台的 可以定义接口返回中为某个抽象类如<br />class A{<br />DrawLine();<br />};<br /><br />对应平台上具体类<br />class B:public A{<br />  DrawLine();//对应平台上具体画线方法<br />}<br /><br />//工厂类 保存一系列这样的类 其它对象只知道要从这里调用就可以了 而不必知道要分别调用什么具体的子类<br />class AbstractFactory{<br /> A* MakeA() const{<br />  return new B(); //返回具体的类<br /> };<br />};<br /><br /><br />通过这种形式把一系列相关的类给屏蔽了<br />方便进行调用<br /><br />常用于跨平台的代码实现中<br /><br />UML图没有找到<br />后面补充

2003-11-18 00:02 无双
抽象工厂的适用性<br /><br />一个系统需要独立于它的产品的创建 组合与表示时 <br />一个系统需要由它的多个产品系列中的一个来配置时 如GUI<br />当你强调一系列相关的产品对象设计以便进行联合使用时<br />当你提供一个产品类库 而只想显示它们的接口而不是实现时(子类的构建是在接口中进行 外面根本不知道具体的实现代码)<br /><br /><br />效果(还是抄书 不懂的来讨论吧 )<br />分离了具体的类 由工厂对象封装创建产品对象的责任与过程 把客户与类实现分离 客户通过抽象类操作它们的接口<br />易于交换产品序列 只要更换对应的工厂就可以了<br />有利于保证产品的一致性 看上面的考虑情况就知道了<br />难支持新种类的产品 一个工厂可能会有很多具体实现的组合如GUI实现中有MOTIF MAC等 要增加 就必须都增加<br /><br />抽象工厂中只需要知道有一个工厂类和对应的抽象子类就可以 不必知道具体的实现类<br />从而进行了实现屏蔽 也就是 只针对接口而非实现编程的要求 保证了代码的无关性与松耦合性<br /><br />与prototyex比较<br />这两个都是把对应的创建放在类的接口中 <br />外面调用时不需要知道具体的构造的子类 <br /><br />但是抽象工厂放的是相关的类 也就是相互间存在关系的类 而原型法对此不做要求<br />它只需要四个对象做为模板 根据它们来创建后面的子类<br /><br />原型法需要有一个对象做为模板 抽象工厂不需要 它是直接在接口中创建 而不是对象的Clone 有的对象可能Clone不方便 但是不会有构造不方便的类

2003-11-18 22:49 无双
一个UML例子<br />在这里可以看到client只与抽象工厂与抽象产品打交道<br />而不与具体产品打交道

2003-11-18 22:52 无双
这个图体现了由factory与产品的关系<br />factory创建产品<br /><br />客户通过factory生成某个产品<br />再调用它们<br /><br /><a href='http://www.itec.uni-klu.ac.at/~harald/ds2001/rmi/factory/factory2.html' target='_blank'>http://www.itec.uni-klu.ac.at/~harald/ds20...y/factory2.html</a><br /><br /><br />上一张图是<br /><a href='http://www.vico.org/pages/PatronsDisseny/Pattern%20Abstract%20Factory/' target='_blank'>http://www.vico.org/pages/PatronsDisseny/P...ract%20Factory/</a>

2003-11-18 22:57 无双
书上例子<br /><a href='http://www.cs.unb.ca/profs/wdu/cs4015w02/ch3b.htm' target='_blank'>http://www.cs.unb.ca/profs/wdu/cs4015w02/ch3b.htm</a>

2003-11-20 18:03 qinxj
good&#33;

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.