你如何创建你的工厂?

3

因此,谈到工厂的主题,我想知道它们是如何设置的。

从我的角度来看,我可以看到三种类型的工厂:

全能型

一家工厂基本上包含了应用程序中使用的所有类。感觉就像只是为了有一个工厂而设立的工厂,并没有真正的结构化。

例如 (其中ClassA、ClassB和ClassC除了在同一个应用中外没有任何共同之处)

class Factory
{
 public static function buildClassA()
 public static function buildClassB()
 public static function buildClassC()
}

提供的代码示例是PHP语言。但是,这个问题与编程语言无关。

内置工厂

下一个是将静态函数与常规函数混合在一起,以创建特殊的创建模式(参见此问题)。

示例:

class ClassA
{
 public static function buildClass()
 public function __construct()
}

工厂旁边

我想到的最后一个是为单个类或单个类集合建立一个工厂。这似乎太不确定,不能以统一的方式使用。

例如(其中ClassA、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()
}

我的问题是:这些都是坏主意吗?有没有其他创建工厂的方法?这些中有哪些是真正的好主意?那么,创建工厂的好/最佳方式是什么?

关于内置工厂,如果你打算使用一个静态函数作为工厂,构造函数应该设为私有。 - Duncan
3个回答

5
工厂的目的似乎是使使用它的代码不需要知道将构造哪个具体类(这应该由配置工厂来处理)。这似乎排除了“全能型”和“旁路工厂”。
我喜欢Java库经常使用的方法:您有一个创建工厂的静态方法。工厂有一个getInstance方法来创建实例。这给您两个配置点(通过系统属性):默认的FactoryImpl有许多设置,例如它应该生成的类,如果这些配置选项不足够,您还可以完全替换FactoryImpl。
至于“全能型”与“旁路工厂”,我认为工厂不应该生产无关的类。同样,在Java术语中,每个工厂都会生成特定接口的实例。
“全能型”听起来像应该用依赖注入来替换(在其中您有一个容器,可产生各种实例并将它们注入应用程序)。

2
如果你真的对“首选技术”感兴趣,我建议用依赖注入替换它们。
如果这看起来太复杂了,只需记住你可能没有看到工厂的每个用途,所以不要在工厂中硬编码一个类。相反,有一个“Setter”可以指定需要注入哪个类。
当你进行单元测试并需要开始注入模拟类时,这将非常有用。
但是,当你使它更通用、抽象和可重用时,最终会回到依赖注入。(只是不要说我没有警告过你)

0

在编程领域中,工厂通常分为两种标准类型,至少是根据GOFpatterns书籍上的许多slew后来得出的结论:基本FactoryAbstract Factory

工厂通常会通过接口返回调用者所需的具体实例,例如:

// createWidget() here instantiates a BigWidget or SmallWidget or whatever the context calls for
IWidget widget = WidgetFactory.createWidget(someContextValue);

使用接口的工厂可以让调用者不与特定类型的返回对象耦合。遵循古老的单一职责原则,一个工厂应该只做一件事情,即返回被调用的接口的具体实例,而不做其他任何事情。一个基本的工厂只需要创建一种类型的对象。

另一方面,抽象工厂可以被看作是一个工厂的集合,并且可能更接近于您所考虑的“全能”工厂。抽象工厂通常在启动时配置为返回一组相关的工厂,例如根据给定的上下文可能创建特定GUI系列的工厂。这是依赖反转的一个例子,已经被像Spring这样的IOC容器取代。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接