[英]How do you create your Factories?
因此,谈到工厂问题,我想知道它们是如何设置的。
从我的立场,我可以看到三种工厂:
一体
一个工厂,基本上包含应用程序中使用的所有类。 感觉好像只是为了拥有工厂而拥有工厂,而没有真正的结构化感觉。
示例(ClassA,Class B和ClassC除了在同一App中没有其他共同点之外) :
class Factory
{
public static function buildClassA()
public static function buildClassB()
public static function buildClassC()
}
提供的代码示例在PHP中。 但是,这个问题与语言无关。
建厂
下一个是将静态函数与常规函数混合,以形成特殊的创建模式(请参阅此问题 )
例:
class ClassA
{
public static function buildClass()
public function __construct()
}
工厂现场
我能想到的最后一个是为单个班级或单个班级建立工厂。 这似乎只是可变地以统一的方式使用。
示例(与Class A,B和C相关,并且与1、2和3相关):
class FactoryAlpha
{
public static function buildClassA()
public static function buildClassB()
public static function buildClassC()
}
class FactoryNumeric
{
public static function buildClass1()
public static function buildClass2()
public static function buildClass3()
}
我的问题是:所有这些坏主意,都是坏主意吗? 还有其他创建工厂的方法吗? 这些真的是好主意吗? 创建工厂的最佳/最佳方法是什么。
工厂的要点似乎是拥有使用它的代码,而无需知道将构造哪个具体类(应通过配置工厂来处理)。 这似乎排除了“多合一”和“边上工厂”的可能。
我喜欢Java库经常使用的方法:您有一个创建Factory的静态方法。 工厂具有创建实例的getInstance方法。 这为您提供了两个配置点(通过系统属性):默认的FactoryImpl具有许多设置,例如它应生成的类,并且如果这些配置选项不够用,您也可以完全交换FactoryImpl。
至于“全能”与“边上工厂”,我认为工厂不应产生无关的类。 同样,用Java术语来说,每个工厂都会生成某个接口的实例。
“多合一”听起来应该用Dependency Injection(依赖注入)取代(在该容器中,您可以生成各种实例并将其注入到应用程序中)。
如果您真的对“首选技术”感兴趣,我将其全部替换为“依赖注入”。
如果那看起来很沉重,请记住您可能没有看到工厂的每种用法,所以不要在工厂中“新建”一个硬编码的类。 而是有一个“ Setter”,可以指定需要注入的类。
稍后在进行单元测试并需要开始注入模拟类时,这将派上用场。
但是,当您使它变得更加通用,抽象和可重用时,您将回到DI。 (只是不要说我没有警告过你)
实际上只有至少两种标准类型的工厂,至少根据GOF和随之而来的大量 模式书:基本工厂和抽象工厂 。
工厂通常返回调用者通过接口引用的具体实例,如下所示:
// createWidget() here instantiates a BigWidget or SmallWidget or whatever the context calls for
IWidget widget = WidgetFactory.createWidget(someContextValue);
通过这种方式使用带有接口的工厂,可以防止调用者耦合到特定类型的返回对象中。 遵循古老的单一职责原则 ,工厂应该做一件事,即返回所要求的接口的具体实例,仅此而已。 基本工厂只能完成创建一种对象的工作。
另一方面,抽象工厂可以被认为是工厂的工厂,并且可能更接近于您所想的“多合一”工厂。 通常在启动时将抽象工厂配置为返回一组相关工厂,例如,可能根据给定上下文创建特定GUI系列的工厂。 这是Dependency Inversion的一个示例,在很大程度上已被使用Spring等IOC容器所取代。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.