2016-02-17 84 views
0

我们已经拥有了很多模型对象的系统(例如CarPedestrianRoad,...)辛格尔顿Vs的辛格尔顿厂

目前,所有的人都管理者(CarManagerPedestrianManagerRoadManager)返回一个各个班级的单身人士。

提出的替代方案是具有ManagerFactory单例,其可以返回CarManager,PedestrianManager,RoadManager的实例。 (例如ManagerFactory.getInstance().getCarManager()

我们也为项目编写测试,关注的是如果我们要使用依赖注入,我们需要一个实际的对象实例来注入管理者。

这是替代一个好?你会在这种情况下将单身人士变成别的东西吗?

+0

这是见仁见智,但我会去任何选项给你代码的不同部分之间的耦合/交叉依赖最少的。此外,无论您需要如何分配代码在您的代码库中的工作方式,只要这是有道理的。 – nielsbot

+0

然而,我的本能是没有'ManagerFactory' - 我认为这并不复杂。 – nielsbot

回答

0

直接单身或单身工厂基本上是相同的东西 - 一个不透明的参考的东西 - 一个隐藏的依赖。通过全局文本搜索,您可以找到这些依赖关系,因此这两种选项都不会使情况变得更好或更糟。

依赖注入意味着你公开宣称,对于实例的工作,它需要B的一个实例(或符合协议的C实例是一个更好的依赖情况)。这要求你在某处实例化B并将其传递给A.

从测试的角度来看,依赖注入远远优越,因为你通常要创建一个模拟版本的B,并用它来测试A.测试注入要使用的实例。测试单身是一种痛苦......

所以,理想情况下,参与将创造B的一个实例,并把它传递给需要它的其他类一流,该实例会从那里通过。

+0

因此,你所说的总体情况是这两种方法是相同的,但第二种方法更好,因为它允许依赖注入? – Ravul

+0

单身不会阻止依赖注入正因为如此,但如果你使用依赖注入,你通常不会使用一个单身。对于工厂,如果它增加了一些值,使用它,如果它真的只是调用alloc + init,那么它不会增加值,如果它有一些构建器逻辑,那么它可以增加值。 – Wain