让我们分析一下建造者模式和工厂模式

fvsl 2003-05-27 10:22:00
加精
我正在做这方面的课题,大家有兴趣的话发表一下自己的意见,这里讨论模式的人不多,这个局面应该改变一下才对:)
...全文
2227 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
huge_spine 2003-06-25
  • 打赏
  • 举报
回复
我来理解一下libi的说法吧:
以《设计模式》的例子来说:
Abstract Factory
Maze * MazeGame::CreateMaze(MazeFactory& factory){
Maze* aMaze=factory.MakeMaze();
Room* r1=factory.MakeRoom(1);
Room* r2=factory.MakeRoom(2);
Door* aDoor=factory.MakeDoor(r1,r2);
aMaze->AddRoom(r1);
aMaze->AddRoom(r2);
......
}
我认为在这里MazeGame可以看作Client,直接使用抽象工厂的方法,所谓封装了“结构性”的东西
在Builder中:
Maze* MazeGame::CreateMaze(MazeBuilder& builder){
builder.BuildMaze();
builder.BuildRoom(1);
builder.BuildRoom(2);
builder.Builddoor(1,2);

return builder.GetMaze();
}
这里MazeGame扮演的是Director角色,CreateMaze方法可以重载,所以可以实现复杂的“流程”,也即libi所说的封装“过程性”的东西。

各位说我说得对不对啊?

huge_spine 2003-06-25
  • 打赏
  • 举报
回复
libi是不是受令狐冲的启发——最高境界是无招啊?呵呵
yaser2000 2003-06-25
  • 打赏
  • 举报
回复
不要刻意的往模式上套。
但是,在有些情况下,模式确实是解决某一类问题的绝妙的,健壮的,具有很好扩展性的办法。
libi 2003-06-25
  • 打赏
  • 举报
回复
遇到问题时,我们会有两种处理方式:
1、哦,这个问题好像可以用抽象工厂解决,试试,好像有点不妥,再试试建造者看,恩,这回行了;
2、这个问题嘛,当然应该是这样,这样,这样解决它,恩,搞定,咦,怎么竟然和建造者模式一样。
上面我推崇第二种,你可以记不住模式的具体形式,但遇到问题时,自然而然就用上了模式。学模式主要的是学它的思想,不要拘泥于它的具体形式,遇到问题时想怎么解决就怎么解决,不要套模式。
这就是我想说的。
granddad 2003-06-24
  • 打赏
  • 举报
回复
ffff
libi 2003-06-21
  • 打赏
  • 举报
回复
不能说建造者模式尺度比抽象工厂大,两个是不同的方面,一个封装结构,一个封装过程,只是过程中通常会使用结构,但没必要这样去比较。同样一个“鸡扒饭”,就可以既有建造者模式,也有抽象工厂,生产部门关心生产流程,采购部门关心原料构成,要看具体的使用环境。这两个模式加深了我们对封装的体会,当我们遇到类似的问题是就会用封装去处理,至于它属于哪种模式没有必要去区分。
我不是高手,但我知道有这么一种境界,我想努力达到这种境界,当然刻意忘掉招式那是另一种“着相”,只是没有必要去记住招式。
jeffyan77 2003-06-21
  • 打赏
  • 举报
回复
謝謝
lhlemail 2003-06-20
  • 打赏
  • 举报
回复
建造样式与抽象工厂样式的区别

读者可能已经注意到了,建造样式与抽象工厂样式非常相像,而两者又都是用来建构同时属于几个产品族的对象的样式。那么这两种样式有什么样的区别呢?抽象工厂样式的简略类别图如下所示。

在抽象工厂样式中,每一次工厂对象被呼叫时都会传回一个完整的产品对象,而使用端有可能会决定把这些产品组装成一个更大的和复杂的产品,也有可能不会。工厂对象是没有状态的,不知道上一次构建的是哪一个产品,也没有未来的概念,不知道下一次构建的是哪一个产品,更不知道自己构建的产品在更高层的产品结构蓝图中是什么位置。

建造类别则不同,建造样式的重点在导演者角色。导演者对象是有状态的,它知道整体蓝图,知道上一次、这一次和下一次交给建造者角色去构建的零件是什么,以便能够将这些零件组装成为一个更大规模的产品。它一点一点地建造出一个复杂的产品,而这个产品的组装程序就发生在导演者角色内部。建造者样式的使用端拿到的是一个完整的最后产品。

换言之,虽然抽象工厂样式与建造样式都是设计样式,但是抽象工厂样式处在更加具体的尺度上,而建造样式则处于更加宏观的尺度上。一个系统可以由一个建造样式和一个抽象工厂样式组成,使用端通过呼叫这个导演角色,间接地呼叫另一个抽象工厂样式的工厂角色。工厂样式传回不同产品族的零件,而建造者样式则把它们组装起来。

比如仍以众神造人为例,女娲利用建造样式负责把灵魂、耳目、手臂等组合成一个完整的人,而黄帝、上骈、桑林各自利用工厂样式创造出灵魂、耳目、臂手等。女娲不必考虑灵魂、耳目、手臂是什么样子、怎么创造出来的,这就成为一个由建造样式和抽象工厂样式组合而成的系统。

本书认为建造样式这个名字不如改为导演样式更能反映出本样式的本质,也更容易与工厂样式区分。实际上,只要向简单工厂样式、工厂方法样式、抽象工厂样式(甚至原型样式)中加入一个通晓整体产品结构的导演者角色,就可以得到某种形式的建造样式---由导演者角色反复呼叫各个工厂对象进行零件建造,然后由导演者角色进行零件组装,形成最后产品。


还是简体字好看一些!
libi 2003-06-17
  • 打赏
  • 举报
回复
工厂方法方法应该算是一种思想,即对于一个易变的、目前不确定的东西做个接口,留给以后实现,这样可以达到某种程度的解耦。
抽象工厂也有接口,但它倒不是出于难以确定的目的,而是因为复杂而封装为接口供使用。举个例子来说,桌子由桌面和桌脚两部分组成,桌面有圆形和方形两种,桌脚有三脚和四脚两种,我们可以封装出一个叫“书桌”的东西供客户使用,只要是说到“书桌”就是指四脚的方桌。
建造者也是一种封装,只是它封装的是过程。举例来说,钢材可以生产出棒材和钢管两种产品,这两种产品开始总要经过轧机,最后总要冷却,它们中间也可能有相同的工艺,但我们还是分别把它们封装为棒材流水线和钢管流水线,而不是通过“到某某环节时用某某工艺”来控制它们的生产流程。
抽象工厂和建造者都是对复杂东西的封装,使得用户看起来或使用起来简单,只是一个封装的是结构性的东西,另一个封装的是过程性的东西。这都是oo的封装和接口的思想的运用。

设计模式这个东西就像张无忌学的太极拳,招式只是为了领会精要,一旦领会,就要把具体的招式忘掉。不要拘泥于设计模式的具体形式。

路过,有痰(谈),一吐为快!
lvkai 2003-06-17
  • 打赏
  • 举报
回复
我的感觉,招式还不能忘。真的到了极高手、能忘的境界,不是真的忘了,而是忘与不忘没了区别。
fats2 2003-06-17
  • 打赏
  • 举报
回复
强烈建议 libi(风自吟) 不要把具体的招式忘掉
因为很难判断是否完全吃透了
fats2 2003-06-14
  • 打赏
  • 举报
回复
大哥:可以结贴了吧
都冷了
SureBeiJing 2003-06-10
  • 打赏
  • 举报
回复
真够热闹的呵呵,区别嘛:

Factory-method:需要类继承;
Abstract-Factory:需要Factory-method来实现一个“有形”的工厂,生产“有形”产品;
Builder:组合一些“现成”的半成品为一个单一的“成品”。

Abstract-Factory和Builder通过是对“对象”实例进行操作来“生产”的,
Factory-method需要通过“继承”来建造新的“工厂”才能生产新的产品。

biggie 2003-06-09
  • 打赏
  • 举报
回复
呵呵
fats2 2003-06-07
  • 打赏
  • 举报
回复
kind维和family维:abstract factory
北极猩猩 2003-06-04
  • 打赏
  • 举报
回复
我觉得抽象工厂(Abstract Factory)应该应用在具有多个产品系列的条件下。
fats2 2003-06-02
  • 打赏
  • 举报
回复
个人觉得工厂模式较简单,但是我很怀疑自己的观点
所以很希望各位提一些我没注意到的问题
Javcy 2003-06-02
  • 打赏
  • 举报
回复
very good
lynx1111 2003-06-01
  • 打赏
  • 举报
回复
很好!
fats2 2003-06-01
  • 打赏
  • 举报
回复
因为看设计模式有一段时间了,我昨天问的问题比较傻
再看了书以后,已经明白了
我已经明白了jeffyan77的意思,
但是我觉得director中对创建过程的规定,
builder对零件种类的规定
和对象的创建依赖(用builder模式未必是对象创建依赖的情况,而对象创建依赖的情况必用builder模式)
都是builder模式的重点

加载更多回复(16)
目录 第1章UML类图实训 1.1知识讲解 1.1.1UML概述 1.1.2类与类的UML表示 1.1.3类之间的关系 1.2实训实例 1.2.1类图实例之图书管理系统 1.2.2类图实例之商场会员管理系统 1.3实训练习 第2章面向对象设计原则实训 2.1知识讲解 2.1.1面向对象设计原则概述 2.1.2单一职责原则 2.1.3开闭原则 2.1.4里氏代换原则 2.1.5依赖倒转原则 2.1.6接口隔离原则 2.1.7合成复用原则 2.1.8迪米特法则 2.2实训实例 2.2.1单一职责原则实例分析 2.2.2开闭原则实例分析 2.2.3里氏代换原则实例分析 2.2.4依赖倒转原则实例分析 2.2.5接口隔离原则实例分析 2.2.6合成复用原则实例分析 2.2.7迪米特法则实例分析 2.3实训练习 第3章创建型模式实训 3.1知识讲解 3.1.1设计模式 3.1.2创建型模式概述 3.1.3简单工厂模式 3.1.4工厂方法模式 3.1.5抽象工厂模式 3.1.6建造者模式 3.1.7原型模式 3.1.8单例模式 3.2实训实例 3.2.1简单工厂模式实例之图形工厂 3.2.2工厂方法模式实例之日志记录器 3.2.3抽象工厂模式实例之数据库操作工厂 3.2.4建造者模式实例之游戏人物角色 3.2.5原型模式实例之快速创建工作周报 3.2.6单例模式实例之多文档窗口 3.3实训练习 第4章结构型模式实训 4.1知识讲解 4.1.1结构型模式概述 4.1.2适配器模式 4.1.3桥接模式 4.1.4组合模式 4.1.5装饰模式 4.1.6外观模式 4.1.7享元模式 4.1.8代理模式 4.2实训实例 4.2.1适配器模式实例之算法适配 4.2.2桥接模式实例之跨平台视频播放器 4.2.3组合模式实例之杀毒软件 4.2.4装饰模式实例之界面显示构件库 4.2.5外观模式实例之文件加密 4.2.6享元模式实例之围棋棋子 4.2.7代理模式实例之日志记录代理 4.3实训练习 第5章行为型模式实训 5.1知识讲解 5.1.1行为型模式概述 5.1.2职责链模式 5.1.3命令模式 5.1.4解释器模式 5.1.5迭代器模式 5.1.6中介者模式 5.1.7备忘录模式 5.1.8观察者模式 5.1.9状态模式 5.1.10策略模式 5.1.11模板方法模式 5.1.12访问者模式 5.2实训实例 5.2.1职责链模式实例之在线文档帮助系统 5.2.2命令模式实例之公告板系统 5.2.3解释器模式实例之机器人控制程序 5.2.4迭代器模式实例之商品名称遍历 5.2.5中介者模式实例之温度转换器 5.2.6备忘录模式实例之游戏恢复点设置 5.2.7观察者模式实例之股票变化 5.2.8状态模式实例之银行账户 5.2.9策略模式实例之电影票打折 5.2.10模板方法模式实例之数据库操作 5.2.11访问者模式实例之奖励审批 5.3实训练习 第6章模式联用与综合实例实训 6.1设计模式补充知识 6.1.1反射与配置文件 6.1.2GRASP模式 6.1.3架构模式与MVC 6.2模式联用实训 6.2.1适配器模式与桥接模式联用 6.2.2组合模式与命令模式联用 6.2.3外观模式与单例模式联用 6.2.4原型模式与备忘录模式联用 6.2.5观察者模式与组合模式联用 6.2.6访问者模式、组合模式与迭代器模式联用 6.3综合实例实训 6.3.1多人联机射击游戏 6.3.2数据库同步系统 6.4实训练习 附录A参考答案 A.1第1章实训练习参考答案 A.2第2章实训练习参考答案 A.3第3章实训练习参考答案 A.4第4章实训练习参考答案 A.5第5章实训练习参考答案 A.6第6章实训练习参考答案 参考文献
C#设计模式(1) 一、 C# 面向对象程序设计复习 二、 设计模式举例 三、 先有鸡还是先有蛋? 四、 大瓶子套小瓶子还是小瓶子套大瓶子? 五、 .net本质 C#设计模式(2) 一、 "开放-封闭"原则(OCP) 二、 里氏代换原则(LSP) C#设计模式(3) 三、 依赖倒置原则(DIP) 四、 接口隔离原则(ISP) 五、 合成/聚合复用原则(CARP) 六、 迪米特法则(LoD) C#设计模式(4)-Simple Factory Pattern 一、 简单工厂(Simple Factory)模式 二、 Simple Factory模式角色与结构: 三、 程序举例: 四、 Simple Factory模式演化 五、 优点与缺点: C#设计模式(5)-Factory Method Pattern 一、 工厂方法(Factory Method)模式 二、 Factory Method模式角色与结构: 三、 程序举例: 四、 工厂方法模式与简单工厂模式 五、 Factory Method模式演化 六、 Factory Method模式与其它模式的关系 七、 另外一个例子 C#设计模式(6)-Abstract Factory Pattern 一、 抽象工厂(Abstract Factory)模式 二、 Abstract Factory模式的结构: 三、 程序举例: 四、 在什么情形下使用抽象工厂模式: 五、 抽象工厂的起源 六、 Abstract Factory模式在实际系统中的实现 七、 "开放-封闭"原则 C#设计模式(7)-Singleton Pattern 一、 单例(Singleton)模式 二、 Singleton模式的结构: 三、 程序举例: 四、 在什么情形下使用单例模式: 五、 Singleton模式在实际系统中的实现 六、 C#中的Singleton模式 C#设计模式(8)-Builder Pattern 一、 建造者(Builder)模式 二、 Builder模式的结构: 三、 程序举例: 四、 建造者模式的活动序列: 五、 建造者模式的实现: 六、 建造者模式的演化 七、 在什么情况下使用建造者模式 C#设计模式(9)-Prototype Pattern 一、 原型(Prototype)模式 二、 Prototype模式的结构: 三、 程序举例: 四、 带Prototype Manager的原型模式 五、 浅拷贝与深拷贝 六、 Prototype模式的优点与缺点 C#设计模式(10)-Adapter Pattern 一、 适配器(Adapter)模式 二、 类的Adapter模式的结构: 三、 类的Adapter模式示意性实现: 四、 对象的Adapter模式的结构: 五、 对象的Adapter模式示意性实现: 六、 在什么情况下使用适配器模式 七、 一个实际应用Adapter模式的例子 八、 关于Adapter模式的讨论 C#设计模式(11)-Composite Pattern 一、 合成(Composite)模式 二、 合成模式概述 三、 安全式的合成模式的结构 四、 安全式的合成模式实现 五、 透明式的合成模式结构 六、 透明式的合成模式实现 七、 使用合成模式时考虑的几个问题 八、 和尚的故事 九、 一个实际应用Composite模式的例子 C#设计模式(12)-Decorator Pattern 一、 装饰(Decorator)模式 二、 装饰模式的结构 三、 装饰模式示例性代码 四、 装饰模式应当在什么情况下使用 五、 装饰模式实际应用的例子 六、 使用装饰模式的优点和缺点 七、 模式实现的讨论 八、 透明性的要求 九、 装饰模式在.NET中的应用 C#设计模式(13)-Proxy Pattern 一、 代理(Proxy)模式 二、 代理的种类 三、 远程代理的例子 四、 代理模式的结构 五、 代理模式示例性代码 六、 高老庄悟空降八戒 七、 不同类型的代理模式 八、 代理模式实际应用的例子 设计模式(14)-Flyweight Pattern 一、 享元(Flyweight)模式 二、 单纯享元模式的结构 三、 单纯享元模式的示意性源代码 四、 复合享元模式的结构 五、 一个咖啡摊的例子 六、 咖啡屋的例子 七、 享元模式应当在什么情况下使用 八、 享元模式的优点和缺点 设计模式(15)-Facade Pattern 一、 门面(Facade)模式 二、 门面模式的结构 三、 门面模式的实现 四、 在什么情况下使用门面模式 五、 一个例子 六、 使用门面模式的设计 设计模式(16)-Bridge Pattern 一、 桥梁(Bridge)模式 二、 桥梁模式的结构 三、 桥梁模式的示意性源代码 四、 调制解调器问题 五、 另外一个实际应用Bridge模式的例子 六、 在什么情况下应当使用桥梁模式 设计模式(17)-Chain of Responsibility Pattern 一、 职责链(Chain of Responsibility)模式 二、 责任链模式的结构 三、 责任链模式的示意性源代码 四、 纯的与不纯的责任链模式 五、 责任链模式的实际应用案例 六、 责任链模式的实现 设计模式(18)-Command Pattern 一、 命令(Command)模式 二、 命令模式的结构 三、 命令模式的示意性源代码 四、 玉帝传美猴王上天 五、 命令模式的实现 六、 命令模式的实际应用案例 七、 在什么情况下应当使用命令模式 八、 使用命令模式的优点和缺点 设计模式(19)-Observer Pattern 一、 观察者(Observer)模式 二、 观察者模式的结构 三、 观察者模式的示意性源代码 四、 C#中的Delegate与Event 五、 一个实际应用观察者模式的例子 六、 观察者模式的优缺点 设计模式(20)-Visitor Pattern 一、 访问者(Visitor)模式 二、 访问者模式的结构 三、 示意性源代码 四、 一个实际应用Visitor模式的例子 五、 在什么情况下应当使用访问者模式 六、 使用访问者模式的优点和缺点 设计模式(21)-Template Method Pattern 一、 模板方法(Template Method)模式 二、 模版方法模式的结构 三、 模板方法模式的示意性代码 四、 继承作为复用的工具 五、 一个实际应用模板方法的例子 六、 模版方法模式中的方法 七、 重构的原则 设计模式(22)-Strategy Pattern 一、 策略(Strategy)模式 二、 策略模式的结构 三、 示意性源代码 四、 何时使用何种具体策略角色 五、 一个实际应用策略模式的例子 六、 在什么情况下应当使用策略模式 七、 策略模式的优点和缺点 八、 其它

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧