【发布时间】:2015-02-05 20:21:21
【问题描述】:
让我们保持简单......
class Client
abstract class AbstractBusinessObject
class BusinessObject
class BusinessObjectFactory
好的,所以你的
Client需要对AbstractBusinessObject执行一些操作。显然需要在某处创建一个BusinessObject实例。为什么不在客户端?有什么害处?假设你说服我在我的
BusinessObjectFactory中创建新的BusinessObjects。伟大的。现在工厂不得不做繁重的工作。假设我的工厂有一个Create(DataRow row)方法,因为我的BusinessObject需要 DataRow 从中提取有用的信息。
我的BusinessObject's属性是{get; private set;}。因此我无法在我的工厂中分配任何属性值。反正我不应该。 然而,这意味着我必须完全传递DataRow。所以基本上工厂只是传递我的参数。这里的工厂有什么用?好的,所以我可能对
BusinessObject有不同的实现——它们每个都有不同的构造函数。我想工厂知道如何构建任何特定的BusinessObject是有意义的。但话又说回来,我需要一个特定的工厂来获得一个特定的BusinessObject。至少我看到的所有例子都表明了这一点。ConcreteFactoryB创建ConcreteProductB(ConcreteFactoryA创建ConcreteProductA) 客户如何知道如何建造工厂?或者甚至创建哪个?啊,工厂被注入了……组合根。对。但我也可以直接注入 BusinessObject。
DoFactory 上的示例让我觉得更清楚一点。是不是要确保
Lion不吃Bisons?而Wolf不以Wildebeests为食?如果这就是工厂试图确保我只想创建一个对象时不需要一个,对吧?
那么像this one here 这样的工厂有意义吗?如果我只有 one Create() 方法,它只生成一种类型的类,那么工厂是否有意义?
真的,我读了很多关于它的文章。 每个例子看起来都像另一个。我错过了重点:(谁能提供一个清晰的现实世界的例子?
https://stackoverflow.com/a/2280289/1407618
去过那里,做到了……
【问题讨论】:
-
我认为这些天使用工厂的情况已经过时了。程序员可以利用工厂模式以及 DI,但是当您可以单独使用 DI 完成所有操作(包括惰性实例化)时,为什么要这样做呢?
-
当创建过程很复杂和/或您想让客户不知道他们应该实例化哪个具体类时,工厂通常很有用。例如。
encryptionAlgorithmFactory.create({ prioritize: 'performance' });在这种情况下,客户端想要一个快速算法,但不必知道要实例化哪个具体的算法。
标签: c# design-patterns factory factory-pattern