`
lintomny
  • 浏览: 225011 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Builder - 创建者模式

阅读更多
对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程的Director要。刚才google到一篇文章,总算清楚了。在这里转贴一下这位richardluo的比喻

简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!

以下是richardluo的代码,我根据他的思路加上了相应的注释。

1,定义工人接口,就是能够完成建造房子任务的人的通用要求。
java 代码
 
  1. // 工人接口,定义了各个工人所要进行的工所作。他们负责进行具体部件如窗户,地板的建造。
  2. // 同时因为房子是民工建的,因此建设完成后由他把房子递交回房主
  3. public interface Builder {  
  4.     
  5.   public  void makeWindow();  
  6.   
  7.   public  void makeFloor();  
  8.   
  9.   public  Room  getRoom();  
  10. }  

2,定义设计师,他的职责是指挥房主指派给他的工人按照自己的设计意图建造房子。
java 代码
 
  1. // 设计师。他知道房子应该怎么设计,但他不会自己去建造,而是指挥民工去建造。  
  2. public class Designer {  
  3.   
  4.   // 指挥民工进行工作  
  5.   public void order(Builder  builder) {  
  6.     builder.makeWindow();  
  7.     builder.makeFloor();  
  8.   }  
  9. }  

3,民工,他负责具体事物的实施。
java 代码
 
  1. // 民工。负责进行具体部件如窗户,地板的建造。
  2. //同时因为房子是民工建的,因此建设完成后由他把房子递交回房主  
  3. public class Mingong  implements Builder {  
  4.   private  String window="";  
  5.   private  String floor="";  
  6.     
  7.   public  void makeWindow() {  
  8.     window=new String("window");  
  9.   }  
  10.   
  11.   public  void makeFloor(){  
  12.     floor=new String("floor");  
  13.   }  
  14.    
  15.   // 回交房子给房主  
  16.   public  Room  getRoom() {  
  17.     if((!window.equals(""))&&(!floor.equals(""))) {  
  18.       System.out.println("room ready!");  
  19.       return new Room();  
  20.     }  
  21.     else return null;  
  22.   }  
  23. }  

4,房主,就是雇人,收房。
java 代码
 
  1. // 房主。房主的任务就是聘请一个民工,一个设计师,同时把民工给设计师指挥,督促设计师开展工作。最后从民工手上收房。    
  2. public class Client {    
  3.     
  4.   public static void main(String[] args) {    
  5.      Builder mingong = new Mingong();    
  6.      Designer  designer = new  Designer();    
  7.      designer.order(mingong);    
  8.      mingong.getRoom();    
  9.   }    
  10. }   

好了,我觉得这样大概能说明白了。不知各位觉得如何呢?或者有更好的应用场景解释,敬请赐教。
分享到:
评论
10 楼 Kay21156929 2015-06-10  
赞一个!!
9 楼 yananay 2007-07-10  
我对 builder 模式的用途的理解就是:

需要做一件复杂的事情,以及如何去执行这个复杂的事情。

请看我的blog

http://yananay.iteye.com/blog/99387

我觉得最重要的是理解每个模式应该应用在什么样的地方,而不是仅仅
了解模式是如何实现的。
8 楼 guanlanxiaozi 2007-07-09  
   看到楼上各位的发言我觉得大家都忽视了主要问题:大家根本就对盖房子这个业务的具体流程没确认,比如盖什么样的房子,有什么具体的步骤……这些必须要具体问题具体分析。
    没搞清楚需求就去谈设计吗?
    我觉得楼主应先给房子一个标准,然后大家在讨论所谓的模式。
7 楼 lindongxiao 2007-07-08  
Director最多只能算个组装员,组装不同的产品的Director也不一样builder也是各式各样的.要什么产品,都要自已指定Director builer
6 楼 huangyh 2007-07-08  
Builder模式重用的是构造过程 ,相同过程构造出来的产品很可能不一样.最明显的里例子就是Tree的构造,不管是WebTree还是SwingTree,他们的构造过程是一样的,但是WebTree输出产品是字符串(构造树的javascript),而SwingTree输出产品是JTree.只有Builder才知道真正的产品是什么.

下面这贴子有使用Builder模式构造Tree的代码.可以参考下
http://www.iteye.com/topic/98668
5 楼 lintomny 2007-04-15  
想了想,如果把getRoom()方法放到Director里面,那不就成了类Proxy模式了吗?

还是以上面的这个建房的场景说事吧。如果我向Director要房子,那么我就不知道他是否用我雇用的民工来干活,也许他私下又雇了其他的人,而不用我雇的人。也就是彻头彻尾的代理了。

之所以要向Mingong要,是为了保证东西是由我亲自选定并信任的人来完成实际工作的
比如我要使用JDBC,那我就不能让Director给我偷偷地改成Hibernate。

这是我的想法,不知道是不是G4当初这样设计的本意。
4 楼 jamesby 2007-04-15  
01robert 写道
jamesby 写道


不过我还是觉得弄个director出来没有太大意义,大家怎么看?


我觉得Director的用处在于,只需要相同的民工就只可以建出各式平房、别墅和高楼大厦。民工和设计的差别太大,所以一定得分开。

build方法应放在director那还是builder那,我也觉得值得商榷,因为整个房子的构建是在设计者那的,下面的MinGong只知道makeWindow、makeFloor,他们并不知道房子是时候建好的,从这点上看getRoom()放在Designer中更好。(放在Mingong中也是可以的,因为在Mingong里需的确可以找到房子)

总觉得设计模式之所以是一门经典的书,并不是它的每个模式中的每个类的每个方法全是经典模式,而是它提供了一种面向不同问题的经典解决思路。如果想实际应用时完全按设计模式来,也太形而上学了。
由builder交房子是正确的,因为房子的状态在builder里面而不在director这里.

当然通过director简介从builder得到房子也是可以考虑的!

director从职责上应该同builder分开,毕竟一个是制造部分,一个是整体设计,两重职业.
3 楼 01robert 2007-04-15  
jamesby 写道


不过我还是觉得弄个director出来没有太大意义,大家怎么看?


我觉得Director的用处在于,只需要相同的民工就只可以建出各式平房、别墅和高楼大厦。民工和设计的差别太大,所以一定得分开。

build方法应放在director那还是builder那,我也觉得值得商榷,因为整个房子的构建是在设计者那的,下面的MinGong只知道makeWindow、makeFloor,他们并不知道房子是时候建好的,从这点上看getRoom()放在Designer中更好。(放在Mingong中也是可以的,因为在Mingong里需的确可以找到房子)

总觉得设计模式之所以是一门经典的书,并不是它的每个模式中的每个类的每个方法全是经典模式,而是它提供了一种面向不同问题的经典解决思路。如果想实际应用时完全按设计模式来,也太形而上学了。
2 楼 jamesby 2007-04-15  
Builder 的目的是把一个比较复杂的对象的构建封装到一个单独的Builder里面,实际上对于使用Builder模式来讲,单独的部件的构建对于client来说没有意义,因此弄个director来构建这个产品!

但是为什么弄个director出来,直接在builder中声明一个builderRoom方法有什么缺点?

我想其中的缺点之一就是单一职责的问题,builder被认为是制作零部件的,director被认为是组装的.

之二就是建造一个房子假设不需要天花板,需要变动的是director而不是builder,也就是将零部件的build与组装解偶.

不过我还是觉得弄个director出来没有太大意义,大家怎么看?
1 楼 spiritfrog 2007-04-15  
刚看了看builder模式,其实可以想象成汽车的组装过程,是在builder中负责生产具体的零件,像车轮,方向盘,发动机等等;在director中就负责把零件拼装成成品。director封装了汽车生产的细节。
我一开始也觉得应该从director要成品了,看到楼主的解释,director负责发布命令,builder才负责真正的生产,所以才会向builder要产品而不是director,有道理。

相关推荐

    设计模式-创建者模式(Builder)

    本人理解的builder模式

    设计模式 创建型模式 Builder模式(建造者)

    Builder模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 统设计中,有时候面临着一个“复杂系统”的创建工作,该对象通常由各个部分的子对象用一定的算法构成,或者说按一定的...

    builder-pattern:使用ES6代理的Typescript的构建器模式

    建造者模式 使用ES6代理为Typescript创建构建器模式。 安装 yarn add builder-pattern 用法 基本用法 interface UserInfo { id : number ; userName : string ; email : string ; } const userInfo = Builder ...

    设计模式-------建造模式

    设计模式之---建造模式 1,建造模式属于对象的...抽象建造者builder接口,实现生产产品操作--创建完成 提供产品实例; ,导演者(director):调用具体建造者角色以创建产品对象; ,产品(Product):建造中的复杂对象,

    设计模式之创建模式Builder

    将一个复杂对象的构造与它的表示分离,使同样的构建 过程可以创建不同的表示,这样的设计模式被称为建造者模式。

    创建者模式(Builder)

    NULL 博文链接:https://bestupon.iteye.com/blog/480245

    C++设计模式原理与实战视频课

    2-9 构建者模式Builder的定义、场景与实现 2-10 构建者模式的实用工程技术——代码的坏味道:算法与对象构建的隔离 2-11 原型模式的定义场景与实现——对象的快速复制 2-12 原型模式的实用工程技术——DRY原则与使用...

    Penglq#book-1#Builder模式1

    Builder模式模式介绍模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Android源码中的模式实现在Android源码

    PHP设计模式之建造者模式(Builder)原理与用法案例详解

    本文实例讲述了PHP设计模式之建造者模式(Builder)原理与用法。分享给大家供大家参考,具体如下: 这个建造者模式,我们也可以称为生成器模式,核心思想是将一个复杂对象的构造与它的表示分离,使同样的构建过程...

    powerbuilder

    功能定义打印作业使用的字体,对每个打印作业PowerBuilder支持八种字体。 语法PrintDefineFont(printjobnumber,fontnumber,facename,height,weight,fontpitch,fontfamily, italic,underline) 参数printjobnumber:用...

    uu-design-pattern:23种设计模式案例

    23种设计模式演示代码文件结构图gof23 |- creational(创建型模式) |- simplefactory 简单工厂模式案例 |- factorymethod 工厂方法模式案例 |- abstractfactory 抽象工厂模式案例 |- builder 建造者模式案例 |- ...

    [创建型模式]设计模式之建造者模式(Builder Pattern)

    NULL 博文链接:https://jacky-dai.iteye.com/blog/2295399

    php设计模式 Builder(建造者模式)

    php /** * 建造者模式 * * 将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示 */ class Product { public $_type = null; public $_size = null; public $_color = null; public function ...

    12-附录 1 设计模式的七大原则(1).html

    建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite...

    antd-form-builder:基于antd的动态元驱动React表单

    蚂蚁形式建造者FormBuilder是一个小帮手(源代码少于500行),轻松使用和构建表单,同时又不会阻止您使用原始的antd form API。 它不仅可以用作可编辑表单,而且可以显示具有表单布局的只读信息。 它同时支持antd v3...

    单例模式源码java-DesignPattern:在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在

    建造者模式 Prototype-------->原型模式 1.2 结构型模式 Adapter-------->适配器模式 Bridge-------->桥接模式 Composite-------->组合模式 Decorator-------->装饰模式 Facade-------->外观模式 ...

    建造者模式(Builder Pattern)原理图

    建造者模式是一种创建型设计模式,用于简化复杂对象的创建过程。以下是建造者模式的关键概念和步骤: 1. **分离复杂对象的构建和表示**:建造者模式将一个复杂对象的构建过程与其最终的表示形式分离开来。这样做的...

    design-pattern-test:设计模式学习

    工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 2 结构型模式---这些设计模式关注类和...

    01-制造工具的工厂模式(1).html

    建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( Decorator ) 代理模式( Proxy ) 外观模式( Facade ) 桥接模式( Bridge ) 组合模式( Composite...

Global site tag (gtag.js) - Google Analytics