Lin*_*osa 23 language-agnostic design-patterns builder-pattern
我已经看到这个问题在这里和那里出现了几次,但我从来没有找到并回答我很高兴.
来自维基百科:
Builder专注于逐步构建复杂对象.Abstract Factory强调一系列产品对象(简单或复杂).Builder将产品作为最后一步返回,但就Abstract Factory而言,产品会立即返回.
但对客户来说不是一回事吗?一旦它被构建,他就会获得完整的对象,所以对他来说没有额外的功能.
我看到它的唯一方法是作为一种方式或按步骤组织构造函数代码,以强制实现构建器的结构.哪个好,但从抽象工厂那里迈出的一步很难.
来自维基百科的下一篇文章是一个很好的参考,以达到我的观点:
通常,设计开始使用工厂方法(不太复杂,可定制,子类增加),并逐渐向抽象工厂,原型或构建器(更灵活,更复杂)发展,因为设计师发现需要更多灵活性的地方.
如果是这样,那么您需要在系统中引入哪种复杂性,从而将抽象工厂更改为构建器?
我的观点是,我无法找到并举例说明抽象工厂是否足够,而你需要一个Builder.
KLE*_*KLE 13
AbstractFactory适用于一系列相关产品.Builder适用于一种产品.
Builder用于逐步构建复杂的产品,而AbstractFactory则以抽象的方式(即一次用于多个实现)构建一个不太复杂的产品.
这些差异对调用代码意味着什么的示例:
对于使用AbstractFactory的客户端代码,每个方法调用都构建一个对象.客户必须将它们组装在一起.在另一边,建设者将在内部组装它们,并提供完整的对象图作为建筑物的最后一步.
构建器允许为客户端代码逐个传递和检查参数.但是他可以在一个步骤中构建最终产品(例如,调用构造函数,立即传递所有参数,甚至是自己构建的复杂参数).这样的助洗剂的产品可以是不可变的对象(或图形)(这是在多线程环境无价的,性能和存储器的原因).
更新以回应此评论:
Lino>尽管如此,它仍然困扰着我.我的意思是,如果你正在构建复合对象,并且你把导演拿出去,将调用构建器方法的责任传递给客户端,那么它对我有用.只有这样,建筑师才能完美契合.但是对于导演来说,它看起来并不多......
确切地说,Builder没有导演,它允许每个客户根据其特定需求创建复杂的产品.客户是董事,因为董事的实施不会被重复使用.
如果你需要重复几次复杂的构建过程,那么你可以有一个方法来封装它(这个方法就是你的"导演").
相反,对于AbstractFactory,您通常需要一个可重用的Director,它可以创建相似的产品(随Factory实现提供).
这里有一些非常好的答案.我只是提供一个类比.
假设您想为新办公室准备一张新桌子.你去一个'工厂'看看选择,然后选择一个架子.如果它符合您的需求,太棒了!
现在你有一个更大的办公室,墙壁非常漂亮.现在你需要一个顶部形状适合办公室的桌子.而且你想要一个不同的腿,以适应其他家具,也适合你的新Aeron椅子.
你回到同一家工厂,没有运气.你去找一个可以自定义"建立"你想要的东西的木匠.您提供您的规格和要求,"建造者"会告诉您某些限制.经过几次迭代,您就拥有了完美的办公桌!
好吧,一个蹩脚的故事,但只是为了减轻事情:P