我有一个按键索引的自定义集合Doohickeys
。此集合具有工厂方法createDoohickey(key)
和访问者Doohickey(key)
。 createDoohickey(key)
应该返回新对象还是应该返回void
?
在第一种情况下,我会像这样使用它
myDoohickey = doohickeys.createDoohickey(key);
doStuff(myDoohickey);
在另一个案例中
doohickeys.createDoohickey(key);
doStuff(doohickeys(key));
您认为哪一个更好,为什么?
编辑我相信这些年来我学到了很多东西,我接受的答案实际上并不是最好的答案。
答案 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)
。
编辑我相信自从我学到了以后,这个答案不一定是最好的答案。