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

fvsl 2003-05-27 10:22:00
加精
我正在做这方面的课题,大家有兴趣的话发表一下自己的意见,这里讨论模式的人不多,这个局面应该改变一下才对:)
...全文
2400 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)

51,407

社区成员

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

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