所以我提出了一个模式,因为根据定义,模式是每个人都反复提出的,我觉得这个模型必须已经有了名字。只是因为我不确定如何谷歌并且过去从未在网上阅读过它。那么......任何人都能认出这一点并为其命名吗?
我叫它煮汤。它本质上有两种方法: add()就像将食材扔进锅里一样,而cook()就像要求最终结果一样。我用它来动态构建一个结构(一个对象树)并用数据填充它。例如,当从SQL ResultSet
构建对象层次结构时,我只是将行数据提供给汤,然后烹饪()以获取使用该数据构建的一些对象的集合。
在我的实际实现中,我使用两种不同的add()方法,因为有时并非所有成分都可用,但结果大致相同。
我使用相同的汤实现来使用不同的数据源构建另一个对象树,例如来自JSON。
所以我想你可以从另一方面看这个东西,然后把它叫做#34;一个带有可互换数据源的对象层次构建器"。
它不是Builder
,因为构建器通常具有明确定义的方法,可以为流程添加特定的部分。使用构建器通常意味着理解底层结构。但在这里,我只是扔了很多东西,而不必了解我实际做的事情。
答案 0 :(得分:1)
Tl;博士:根据您的上述说明,如果您是一次性工厂,请致电add
。如果您不止一次致电add
,那么它就是一个混乱的构建者。无论哪种方式,你可能会更好地使用久经考验的而不是你的Soup
。
首先让我重申我(我认为)对你潜在新模式的理解。您有一个对象Soup
,您创建了该对象。然后在{"成分列表中列出add
" (参数)。最后,您cook
汤,它会根据您add
编辑的参数为您提供某个对象的新实例。
我很抱歉成为坏消息的承担者,如果我歪曲了这一点,请纠正我,但从上面我认为这实际上是一种反模式。有两种模式非常相似,似乎它结合了两者中最差的模式。
第一个是工厂,甚至是基本构造函数。我只是看不到通过add(...)
或new Whatever(...)
无法实现的WhateverFactory.getNewWhatever(...)
来电添加的任何价值。
它非常接近的第二个模式,你在问题中已经承认,是Builder模式。你似乎意识到了相似之处,所以我不会对它们竖起大拇指。我想提一下Builder模式背后的动机及其缺点。创建此模式,以便对象可以为其使用者提供更清晰的创建界面。维基百科将其称为telescoping constructor anti-pattern,其中类的构造函数列表变得非常不连贯。好处是你可以获得更清晰的界面。缺点之一是您必须在实际创建对象之前存储对象的状态,这在线程安全的上下文中意味着对于您想要的每个对象,您最终创建至少2:一个构建器和一个所需对象。另一个经常被忽视的缺点是它打破了用户的期望 - 他们希望new Whatever
,因为这就是语言中其他所有内容的运作方式。你已经破坏了这种模式,并且取决于你的文档有多好(以及你的用户关心阅读它的程度),他们可能不得不花费一些宝贵的时间来解决这个问题。
我提到这些的原因是看起来你Soup
都有这两个缺点。每次要创建新对象时,都需要一个新的Soup
,并且它会添加另一层抽象来获取对象。同时,似乎没有简化界面来获得新对象;你仍然需要传递一个通常与构造函数或工厂相同的参数列表。
我打算尝试制作一个双关语,但我无法想到一个。所以我只是说你应该停止这样做。
如果您不同意我上面所说的内容,请评论对其使用或被忽视的价值的任何误解,我们很乐意回复您。