自定义容器的工厂方法是否应返回新创建的实例?

时间:2009-07-08 14:02:01

标签: factory-method

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

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

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

在另一个案例中

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

您认为哪一个更好,为什么?

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

4 个答案:

答案 0 :(得分:3)

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

因此,我认为你应该有这样的事情:

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:-1)

这个答案来自我的一位同事。他建议让createDoohickey(key)确实归还Doohickey;另外,改为称之为getDoohickey(key)

编辑我相信自从我学到了以后,这个答案不一定是最好的答案。