如何在没有单例的情况下进行编码

如果我没有单身人士,如何确保有一个“ X”实例,以及在需要时如何获得“ X”。 (使用Singleton而不使用Singleton的原因很好-病理骗子)从实际的角度来看,Singleton是开发时间与复杂性之间的权衡。

这些错误隐藏在复杂性中,您将有一天在凌晨2:00起来修复所创建的内容。

我听到很多朋友抱怨通过接口传递对象是令人讨厌和乏味的,这是这种情况:

CViewController的构造函数需要该对象,因此将对象从AViewController传递到CViewController(堆栈与导航堆栈相同)。 添加新的依赖项时,它需要修改五个类才能满足CViewController的要求。 因此,开发人员成为单身人士的朋友。

问题是您正在将对象图构造与应用程序逻辑混合在一起。

大多数开发人员自由地将ViewController的创建与应用程序逻辑混合在一起。 例如

  func clickButtonAction(){ 
 让cViewController = CViewController.init(Object) 
navigator.push(cViewController)
  } 

这是处理按钮动作以推送新的viewController时的常用方法,并且如果按钮的动作无需了解CViewController初始化方式的详细信息。 因此它不需要将对象传递给中间协作者

构造函数依赖图和调用图在本质上是相同的。如果您以内联方式构造对象,则是的,两个图非常相似。 但是,如果将对象图实例化与其执行分开,则两个图是独立的。 这种独立性使我们可以直接在需要依赖项的地方注入依赖项,而无需通过中间协作者传递引用。 (参考来源:http://misko.hevery.com/2008/10/21/dependency-injection-myth-reference-passing/)

  func clickButtonAction(){ 

navigator.push(factory.makeCViewController())
  } 

使用控制反转进行依赖注入的工厂知道您的应用程序的许多上下文,这里有很多“新”运算符,它们负责构建应用程序的对象图。

其他类型的类应没有“新”运算符,并负责执行逻辑工作。 这些类在构造函数中需要它们所需要的,但不传递原始工厂,而是传递一个称为makeCViewController的方法。

AViewController,BViewController和CViewController彼此不再了解,工厂隐藏了构造控制器的细节,而它们所需要的仅仅是工厂实现的协议。

与应用程序逻辑分离的对象图构造可帮助您摆脱将对象传递给中间协作者的麻烦,从而主要由于其便利性而使您摆脱使用单例的麻烦。