繁体   English   中英

您如何创建工厂?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM