ios - 使用工厂类来实例化相关具体类组

标签 ios dependency-injection tdd factory

对于我目前从事的个人项目,我使用依赖注入(inject)和 TDD 作为开发的基础。我还使用工厂类来实现以下目的:

  • 关注点分离:将对象创建的责任与应用程序逻辑代码分开。单点对象创建。
  • 为了简化单元测试,因为我可以模拟工厂创建的对象。
  • Wiring:将某些依赖项/服务注入(inject)到它创建的对象中,而客户端代码不必关心这样做。

我知道通常工厂类应该负责实例化一个特定类型,并且当在运行时动态创建一个类型的不同实现时,它的用处真的很明显,但是,我并没有专门为此目的使用工厂;我的理由是上面列出的那些。为了避免矫枉过正,我没有为每个类创建一个单独的工厂类,而是使用工厂类来实例化相关类的组,例如:

@interface TagsFactory : NSObject

/*
 * Create a new tag with the specified name
 */
-(id<Tag>) createTagWithName:(NSString*) name;

/*
 * Create a new TagsViewController with preselected tags.
 */
-(TagsViewController*) createTagViewControllerWithSelectedTags:(NSArray*) selectedTags;

/*
 * Create a new TagsView
 */
-(TagsView*) createTagsView;

@end

然后,如果一个特定的类需要构造其他对象,我将负责这些对象的工厂类注入(inject)到类中,以便它委托(delegate)对象创建。

我的方法的缺点:

  • 工厂类可能会与许多其他类高度耦合。
  • 工厂类可能会打破单一职责原则。

话虽如此,到目前为止,这种方法在可测试性和便利性方面对我来说效果很好,而且不会过火,也不会被工厂类淹没。

我的问题是:

  1. 这种使用工厂类的做法是否被视为不良做法?如果是,它可能带来哪些危险/风险?
  2. 如果我的方法不好,有什么更好的方法可以在不创建大量工厂类的情况下实现我想要的目标?

谢谢。

最佳答案

对我来说似乎不错(只做了 1-2 年的 TDD,哈哈,但编程已经超过 12 年了),但只是为了让我正确理解你的选择,

  • 你的类(class)结构是怎样的?
  • 你能提供你之前的另一条路线吗 谈论使用更多的工厂类?

您可能已经知道的内容:最好的做法是不要在类内部构造类,而是使用工厂,有时在工厂内设置多个级别也是可以接受的做法。

如果您还没有看过 Misko 的一些视频,请观看。这显示了多层: https://www.youtube.com/watch?v=RlfLCWKxHJ0#t=804

我希望视频中的位置是相关的。我为你扫描了大约 10 分钟,但无法靠近:D 但我一直在寻找他们说如果你有一栋房子和一扇门的地方.. 你如何 build 这两栋房子?在房屋工厂中还是在 houseFactory 和doorFactory 中?

哦,更好的链接:开始 here和一个single build method

关于ios - 使用工厂类来实例化相关具体类组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21011969/

相关文章:

iphone - UIGraphicsGetImageFromCurrentImageContext - 将图像分成两部分创建黑色背景

c++ - 关于服务定位器模式

android - 使用 Dagger 2 自动注入(inject) Activity 的问题

c++ - 如何使用 GTest 测试严重依赖 MFC 的方法

ios - Swift 为 ShinobiGrids 创建 NSObject 数组

ios - 在模拟器中测试GameCenter排行榜,您是否需要“提交审查”?

ios - 为 iPhone 和 iPad Xcode 9 指定与 'View' 不同的宽度

javascript - NestJS:动态模块的缺点?

ruby-on-rails - "nil is not a symbol"用于 rspec 匹配器中的模型计数

ruby-on-rails - 如何干燥这个 rspec 测试?