对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程的Director要。刚才google到一篇文章,总算清楚了。在这里转贴一下这位
richardluo的比喻。
简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了! 以下是richardluo的代码,我根据他的思路加上了相应的注释。 1,定义工人接口,就是能够完成建造房子任务的人的通用要求。
java 代码
2,定义设计师,他的职责是指挥房主指派给他的工人按照自己的设计意图建造房子。
java 代码
3,民工,他负责具体事物的实施。
java 代码
4,房主,就是雇人,收房。
java 代码
好了,我觉得这样大概能说明白了。不知各位觉得如何呢?或者有更好的应用场景解释,敬请赐教。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
| |
返回顶楼 | |
发表时间:2007-04-15
刚看了看builder模式,其实可以想象成汽车的组装过程,是在builder中负责生产具体的零件,像车轮,方向盘,发动机等等;在director中就负责把零件拼装成成品。director封装了汽车生产的细节。
我一开始也觉得应该从director要成品了,看到楼主的解释,director负责发布命令,builder才负责真正的生产,所以才会向builder要产品而不是director,有道理。 | |
返回顶楼 | |
发表时间:2007-04-15
Builder 的目的是把一个比较复杂的对象的构建封装到一个单独的Builder里面,实际上对于使用Builder模式来讲,单独的部件的构建对于client来说没有意义,因此弄个director来构建这个产品!
但是为什么弄个director出来,直接在builder中声明一个builderRoom方法有什么缺点? 我想其中的缺点之一就是单一职责的问题,builder被认为是制作零部件的,director被认为是组装的. 之二就是建造一个房子假设不需要天花板,需要变动的是director而不是builder,也就是将零部件的build与组装解偶. 不过我还是觉得弄个director出来没有太大意义,大家怎么看? | |
返回顶楼 | |
发表时间:2007-04-15
jamesby 写道
不过我还是觉得弄个director出来没有太大意义,大家怎么看? 我觉得Director的用处在于,只需要相同的民工就只可以建出各式平房、别墅和高楼大厦。民工和设计的差别太大,所以一定得分开。 build方法应放在director那还是builder那,我也觉得值得商榷,因为整个房子的构建是在设计者那的,下面的MinGong只知道makeWindow、makeFloor,他们并不知道房子是时候建好的,从这点上看getRoom()放在Designer中更好。(放在Mingong中也是可以的,因为在Mingong里需的确可以找到房子) 总觉得设计模式之所以是一门经典的书,并不是它的每个模式中的每个类的每个方法全是经典模式,而是它提供了一种面向不同问题的经典解决思路。如果想实际应用时完全按设计模式来,也太形而上学了。 | |
返回顶楼 | |
发表时间:2007-04-15
01robert 写道
jamesby 写道
不过我还是觉得弄个director出来没有太大意义,大家怎么看? 我觉得Director的用处在于,只需要相同的民工就只可以建出各式平房、别墅和高楼大厦。民工和设计的差别太大,所以一定得分开。 build方法应放在director那还是builder那,我也觉得值得商榷,因为整个房子的构建是在设计者那的,下面的MinGong只知道makeWindow、makeFloor,他们并不知道房子是时候建好的,从这点上看getRoom()放在Designer中更好。(放在Mingong中也是可以的,因为在Mingong里需的确可以找到房子) 总觉得设计模式之所以是一门经典的书,并不是它的每个模式中的每个类的每个方法全是经典模式,而是它提供了一种面向不同问题的经典解决思路。如果想实际应用时完全按设计模式来,也太形而上学了。 当然通过director简介从builder得到房子也是可以考虑的! director从职责上应该同builder分开,毕竟一个是制造部分,一个是整体设计,两重职业. | |
返回顶楼 | |
发表时间:2007-04-15
想了想,如果把getRoom()方法放到Director里面,那不就成了类Proxy模式了吗?
还是以上面的这个建房的场景说事吧。如果我向Director要房子,那么我就不知道他是否用我雇用的民工来干活,也许他私下又雇了其他的人,而不用我雇的人。也就是彻头彻尾的代理了。 之所以要向Mingong要,是为了 保证东西是由我亲自选定并信任的人来完成实际工作的。 比如我要使用JDBC,那我就不能让Director给我偷偷地改成Hibernate。 这是我的想法,不知道是不是G4当初这样设计的本意。 | |
返回顶楼 | |
发表时间:2007-07-08
Builder模式重用的是构造过程 ,相同过程构造出来的产品很可能不一样.最明显的里例子就是Tree的构造,不管是WebTree还是SwingTree,他们的构造过程是一样的,但是WebTree输出产品是字符串(构造树的javascript),而SwingTree输出产品是JTree.只有Builder才知道真正的产品是什么.
下面这贴子有使用Builder模式构造Tree的代码.可以参考下 http://www.iteye.com/topic/98668 | |
返回顶楼 | |
发表时间:2007-07-08
Director最多只能算个组装员,组装不同的产品的Director也不一样builder也是各式各样的.要什么产品,都要自已指定Director builer
| |
返回顶楼 | |
发表时间:2007-07-09
看到楼上各位的发言我觉得大家都忽视了主要问题:大家根本就对盖房子这个业务的具体流程没确认,比如盖什么样的房子,有什么具体的步骤……这些必须要具体问题具体分析。
没搞清楚需求就去谈设计吗? 我觉得楼主应先给房子一个标准,然后大家在讨论所谓的模式。 | |
返回顶楼 | |
发表时间:2007-07-10
我对 builder 模式的用途的理解就是:
需要做一件复杂的事情,以及如何去执行这个复杂的事情。 请看我的blog http://yananay.iteye.com/blog/99387 我觉得最重要的是理解每个模式应该应用在什么样的地方,而不是仅仅 了解模式是如何实现的。 | |
返回顶楼 |
转载于:https://www.cnblogs.com/Beeling/archive/2013/04/10/3011811.html