|
1
5
工厂的重点似乎是拥有使用它的代码,而不需要知道将构造哪个具体类(这应该通过配置工厂来处理)。这似乎排除了“一体式”和“边上工厂”的可能性。 我喜欢Java库经常使用的方法:您有一个创建工厂的静态方法。工厂有一个getInstance方法来创建实例。这为您提供了两点配置(通过系统属性):默认的factoryimpl有许多设置,比如它应该生成的类,如果这些配置选项不够,您还可以将factoryimpl全部替换掉。 至于“多合一”和“边上工厂”,我认为工厂不应该生产不相关的类。同样,它是Java术语,每一个工厂都会产生特定接口的实例。 “all-in-one”听起来像是应该用依赖注入代替的东西(在这里,您有一个容器,可以生成各种实例并将它们注入到应用程序中)。 |
|
|
2
2
如果你真的对“首选技术”感兴趣,我会用依赖注入来替换它们。 如果这看起来很重,请记住您可能没有看到工厂的所有用途,所以不要在工厂中“新建”硬编码类。相反,有一个“setter”可以指定需要注入什么类。 当您进行单元测试并需要开始注入模拟类时,这将很有用。 但是,当您使它更加通用、抽象和可重用时,您将回到di。(别说我没警告你) |
|
|
3
0
实际上只有两种标准的工厂,至少根据 GOF 以及 slew 属于 patterns 那些书 followed :基本 Factory ,以及 Abstract Factory 。 工厂通常返回调用方通过接口引用的具体实例,如下所示:
以这种方式使用带有接口的工厂可以防止调用方耦合到返回对象的特定类型中。追随尊者 Single Responsibility Principle ,工厂应该做一件事,即返回调用的接口的具体实例,而不是更多。基本工厂应该只负责创建一种类型的对象。 另一方面,一个抽象的工厂可以被认为是一个工厂工厂,可能更接近于你所认为的“一体式”工厂。抽象工厂通常在启动时配置为返回一组相关工厂,例如根据给定上下文可能创建特定gui系列的工厂。这是一个例子 Dependency Inversion 这在很大程度上被ioc容器所取代,比如 Spring 。 |