你如何创建你的工厂?

Tyl*_*ter 3 language-agnostic oop factory

所以,谈到工厂的主题,我想知道他们是如何建立的.

从我的立场,我可以看到3种类型的工厂:

一体

一个工厂,基本上包含应用程序中使用的所有类.感觉它只是为了拥有一个工厂而拥有一个工厂,而且并不真正感觉有条理.

示例(其中ClassA,Class B和ClassC没有任何共同之处,除非在同一个App中):

class Factory
{
 public static function buildClassA()
 public static function buildClassB()
 public static function buildClassC()
}
Run Code Online (Sandbox Code Playgroud)

提供的代码示例使用PHP.但是,这个问题与语言无关.

内置工厂

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

例:

class ClassA
{
 public static function buildClass()
 public function __construct()
}
Run Code Online (Sandbox Code Playgroud)

工厂在旁边

我能想到的最后一个是为个别班级或个别班级设立工厂.这似乎可变,以统一的方式使用.

示例(其中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()
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:所有这些糟糕的想法,其中任何一个都是坏主意吗?还有其他创建工厂的方法吗?这些中的任何一个都是好主意吗?什么是创建工厂的好/最佳方式.

Thi*_*ilo 5

工厂的要点似乎是使用它的代码不需要知道将构造哪个具体类(这应该通过配置工厂来处理).这似乎排除了"All-in One"和"Factory-on-the-Side".

我喜欢Java库经常使用的方法:您有一个创建Factory的静态方法.Factory具有一个用于创建实例的getInstance方法.这为您提供了两个配置点(通过系统属性):默认的FactoryImpl有许多设置,例如它应该生成的类,如果这些配置选项不够,您也可以完全换掉FactoryImpl.

至于"All-in One"与"Factory-on-the-Side",工厂不应该生产我认为不相关的课程.同样,它是Java术语,每个工厂都生成某个接口的实例.

"All-in-One"听起来像是应该用Dependency Injection取代的东西(你有一个产生各种实例并将它们注入应用程序的容器).