标题: [设计模式讨论之]abstract factory抽象工厂
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-11-17 23:48  资料  个人空间  主页 短消息  加为好友 
意图

提供一个创建一系列相关或相互依赖对象的接口而无须指定它们的类

例子
还是书上的
CODE

class MazeFactory{
public:
  MazeFactory();
  virtual Maze* MakeMaze() const{
    return new Maze;
  }
  virtual Wall* MakeWall() const{
    return new Wall;
  }
  virtual Room* MakeRoom(int n){
    return new Room(n);
  }
  virtual Door* MakeDoor(Room* r1,Room* r2){
    return new Door(r1,r2);
  }
};


上面的MazeFactory{类提供了四个接口
这四个接口分别用于创建四个相关联类型的对象 Maze Wall Room Door,
当其它对象调用这四个对象时 只要调用MazeFactory类中对应的接口就可以了
而不必指明需要哪个具体的类进行创建

这样 你可以定义四个抽象基类做为接口的返回值
在接口的实现中定义具体实现的类 如跨平台的 可以定义接口返回中为某个抽象类如
class A{
DrawLine();
};

对应平台上具体类
class B:public A{
DrawLine();//对应平台上具体画线方法
}

//工厂类 保存一系列这样的类 其它对象只知道要从这里调用就可以了 而不必知道要分别调用什么具体的子类
class AbstractFactory{
A* MakeA() const{
return new B(); //返回具体的类
};
};


通过这种形式把一系列相关的类给屏蔽了
方便进行调用

常用于跨平台的代码实现中

UML图没有找到
后面补充





不要问我结果 我只研究过程与思路
无双客栈
顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-11-18 00:02  资料  个人空间  主页 短消息  加为好友 
抽象工厂的适用性

一个系统需要独立于它的产品的创建 组合与表示时
一个系统需要由它的多个产品系列中的一个来配置时 如GUI
当你强调一系列相关的产品对象设计以便进行联合使用时
当你提供一个产品类库 而只想显示它们的接口而不是实现时(子类的构建是在接口中进行 外面根本不知道具体的实现代码)


效果(还是抄书 不懂的来讨论吧 )
分离了具体的类 由工厂对象封装创建产品对象的责任与过程 把客户与类实现分离 客户通过抽象类操作它们的接口
易于交换产品序列 只要更换对应的工厂就可以了
有利于保证产品的一致性 看上面的考虑情况就知道了
难支持新种类的产品 一个工厂可能会有很多具体实现的组合如GUI实现中有MOTIF MAC等 要增加 就必须都增加

抽象工厂中只需要知道有一个工厂类和对应的抽象子类就可以 不必知道具体的实现类
从而进行了实现屏蔽 也就是 只针对接口而非实现编程的要求 保证了代码的无关性与松耦合性

与prototyex比较
这两个都是把对应的创建放在类的接口中
外面调用时不需要知道具体的构造的子类

但是抽象工厂放的是相关的类 也就是相互间存在关系的类 而原型法对此不做要求
它只需要四个对象做为模板 根据它们来创建后面的子类

原型法需要有一个对象做为模板 抽象工厂不需要 它是直接在接口中创建 而不是对象的Clone 有的对象可能Clone不方便 但是不会有构造不方便的类





不要问我结果 我只研究过程与思路
无双客栈
顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-11-18 22:49  资料  个人空间  主页 短消息  加为好友 
一个UML例子
在这里可以看到client只与抽象工厂与抽象产品打交道
而不与具体产品打交道



 附件: 您所在的用户组无法下载或查看附件




不要问我结果 我只研究过程与思路
无双客栈
顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-11-18 22:52  资料  个人空间  主页 短消息  加为好友 
这个图体现了由factory与产品的关系
factory创建产品

客户通过factory生成某个产品
再调用它们

http://www.itec.uni-klu.ac.at/~harald/ds20...y/factory2.html


上一张图是
http://www.vico.org/pages/PatronsDisseny/P...ract%20Factory/



 附件: 您所在的用户组无法下载或查看附件




不要问我结果 我只研究过程与思路
无双客栈
顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-11-18 22:57  资料  个人空间  主页 短消息  加为好友 



 附件: 您所在的用户组无法下载或查看附件




不要问我结果 我只研究过程与思路
无双客栈
顶部
qinxj
技术专家
Rank: 14Rank: 14Rank: 14Rank: 14



UID 1117
精华 1
积分 166
帖子 328
活跃指数 0
LU金币 5406 个
LU金条 0 个
阅读权限 200
注册 2003-10-29
 
发表于 2003-11-20 18:03  资料  个人空间  短消息  加为好友  添加 qinxj 为MSN好友 通过MSN和 qinxj 交谈
good!





合久必分、分久必和!
顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
 



当前时区 GMT+8, 现在时间是 2008-11-24 00:05
乐悠LoveUnix论坛-京ICP备05005823号

Thanks to Discuz!  © 2001-2007    Power by LoveUnix.net
Processed in 0.066412 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 乐悠LoveUnix - Archiver