1

我有一个Doohickeys按键索引的自定义集合。这个集合有一个工厂方法createDoohickey(key)和一个访问器Doohickey(key)。应该createDoohickey(key)返回新对象还是应该返回void

在第一种情况下,我会这样使用它

myDoohickey = doohickeys.createDoohickey(key);
doStuff(myDoohickey);

在这种情况下

doohickeys.createDoohickey(key);
doStuff(doohickeys(key));

你认为哪一个更可取,为什么?

编辑我相信这些年来我学到了很多东西,而且我接受的答案实际上并不是最好的。

4

4 回答 4

3

我不确定容器应该有一个工厂方法来创建它包含的对象 - 良好的关注点分离是将对象创建与容器分开。

因此,我认为你应该有这样的东西:

Doohickey myDookickey = new Doohickey();
doohickys.Add(key, myDookickey);
doStuff(myDookickey); // or
doStuff(doohickeys(key));

然后,您可以自由使用单独的对象工厂或直接实例化 Doohickey。这使得使用模拟 Doohickey 对象对容器进行单元测试变得更加容易。

如果您必须拥有工厂方法,我会返回 Doohickey,因为在不需要返回值时忽略返回值(假设返回引用/指针)可能比在需要时使用索引检索它更便宜。

于 2009-07-08T14:34:46.063 回答
2

是的,工厂应该返回新创建的实例。 但是,就像 Alex 指出的那样,您可以将存储库和工厂分开。我很可能会设计工厂以引用存储库。只要工厂方法实际上返回新创建的实例,我不认为将两者合并为一个类就意味着世界末日。

于 2009-07-08T14:43:27.953 回答
1

上面的例子在容器类中嵌入了工厂方法。我同意 willcodejavaforfood 的观点,从长远来看,这可能是一个好主意,也可能不是一个好主意。问题在于,将工厂拆分为自己的类所减少的耦合是否值得额外的成本。

至于为什么工厂方法应该返回新创建的实例,最好将创建与包含分离。该类的一些用户可能想要一个但不想要另一个。此外,当您将创建和包含结合起来时,您不能再(单元)测试创建而不测试包含。

于 2009-07-08T16:15:41.080 回答
-1

这个答案来自我的一位同事。他建议createDoohickey(key)确实返回Doohickey; 并且,另外,改为调用它getDoohickey(key)

EDIT I believe after what I have learnt since that this answer is not necessarily the best one any more.

于 2009-07-08T19:23:02.217 回答