所以,谈到工厂这个话题,我想知道它们是如何设置的。
从我站的地方,我可以看到 3 种类型的工厂:
一体化
基本上包含应用程序中使用的所有类的工厂。感觉就是为了有工厂而有工厂,并没有真正的结构感。
示例 (其中 ClassA、Class B 和 ClassC 除了在同一个 App 中之外没有任何共同点):
class Factory
{
public static function buildClassA()
public static function buildClassB()
public static function buildClassC()
}
提供的代码样本是用 PHP 编写的。但是,这个问题与语言无关。
内置工厂
下一个是将静态函数与常规函数混合以创建特殊的创建模式(参见 this question)
示例:
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()
}
我的问题是:所有这些都是坏主意吗?其中任何一个都是坏主意吗?还有其他创建工厂的方法吗?这些实际上是好主意吗?什么是创建工厂的好/最好方法。
最佳答案
工厂的要点似乎是让使用它的代码不需要知道将构造哪个具体类(这应该通过配置工厂来处理)。这似乎排除了“一体化”和“工厂就地”的可能性。
我喜欢 Java 库经常使用的方法:您有一个创建工厂的静态方法。 Factory 有一个创建实例的 getInstance 方法。这给了你两点配置(通过系统属性):默认的 FactoryImpl 有一些设置,比如它应该产生的类,如果这些配置选项不够用,你也可以完全换掉 FactoryImpl。
至于“All-in One”与“Factory-on-the-Side”,我认为工厂不应该生产不相关的类。同样,用 Java 术语来说,每个工厂都会生成特定接口(interface)的实例。
“一体化”听起来像是应该用依赖注入(inject)(您有一个容器可以生成各种实例并将它们注入(inject)到应用程序中)代替的东西。
关于language-agnostic - 你如何创建你的工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2181269/