Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 单件Vs单件工厂_Ios_Objective C_Design Patterns - Fatal编程技术网

Ios 单件Vs单件工厂

Ios 单件Vs单件工厂,ios,objective-c,design-patterns,Ios,Objective C,Design Patterns,我们的系统有很多模型对象(例如,汽车,行人,道路,…) 目前,它们都有管理器(CarManager,PedestrianManager,RoadManager),这些管理器返回各自类别的单例 建议的另一种选择是使用ManagerFactory单例,该单例可以返回CarManager、PedestrianManager、RoadManager的实例。(例如,ManagerFactory.getInstance().getCarManager()) 我们还为该项目编写了测试,问题是如果我们使用依赖注

我们的系统有很多模型对象(例如,
汽车
行人
道路
,…)

目前,它们都有管理器(
CarManager
PedestrianManager
RoadManager
),这些管理器返回各自类别的单例

建议的另一种选择是使用
ManagerFactory
单例,该单例可以返回
CarManager
PedestrianManager
RoadManager
的实例。(例如,
ManagerFactory.getInstance().getCarManager()

我们还为该项目编写了测试,问题是如果我们使用依赖注入,我们将需要一个对象的实际实例来注入管理器


这个选择好吗?在这种情况下,您会将单例更改为其他内容吗?

单例直接或单例工厂基本上是相同的内容-对某个内容的不透明引用-隐藏的依赖项。通过全局文本搜索,您可以找到这些依赖项,因此这两个选项都不会使情况变得更好或更糟

依赖注入意味着您公开声明,例如实例A要工作,它需要一个实例B(或者符合协议C的实例是更好的依赖情况)。这需要在某个地方实例化B并将其传递给A

从测试的角度来看,依赖注入要高得多,因为您通常希望创建B的模拟版本,并使用该版本来测试a。测试将注入要使用的实例。测试单身是一件痛苦的事


因此,理想情况下,所涉及的第一个类将创建一个B的实例,并将其传递给其他需要它的类,然后该实例将从那里继续传递。

这是我的观点,但我会选择任何一个选项,使代码不同部分之间的耦合/交叉依赖最少。以及任何需要您在代码库中传播代码工作方式知识的内容,如果这有道理的话。但是我的直觉是不要使用
ManagerFactory
——我认为这不太复杂。所以总体来说,你说的是这两种方法是一样的,但是第二种方法更好,因为它允许依赖注入?单例不能阻止依赖注入本身,但是如果您使用依赖注入,您通常不会使用单例。对于工厂,如果它增加了一些值,就使用它,如果它实际上只是调用alloc+init,那么它不增加值,如果它有一些构建器逻辑,那么它可能会增加值。