【发布时间】:2010-12-17 04:52:32
【问题描述】:
我对工厂的理解是,它封装了所有继承公共抽象类或接口的具体类的实例化。这允许客户端与确定创建哪个具体类的过程分离,这反过来意味着您可以在程序中添加或删除具体类,而无需更改客户端的代码。您可能需要更改工厂,但工厂是“专门构建的”,实际上只有一个原因需要更改——添加/删除了一个具体的类。
我已经构建了一些实际上封装了对象实例化的类,但出于不同的原因:对象很难实例化。目前,我将这些类称为“工厂”,但我担心这可能是用词不当,会混淆可能查看我代码的其他程序员。我的“工厂”类不决定实例化哪个具体类,它们保证一系列对象将以正确的顺序实例化,并且当我调用 new() 时,正确的类将传递给正确的构造函数。
例如,对于我正在处理的一个 MVVM 项目,我编写了一个类来确保我的 SetupView 被正确实例化。它看起来像这样:
public class SetupViewFactory
{
public SetupView CreateView(DatabaseModel databaseModel, SettingsModel settingsModel, ViewUtilities viewUtilities)
{
var setupViewModel = new SetupViewModel(databaseModel, settingsModel, viewUtilities);
var setupView = new SetupView();
setupView.DataContext = setupViewModel;
return setupView;
}
}
称其为“工厂”会不会令人困惑?它不会在几个可能的具体类中做出决定,它的返回类型不是接口或抽象类型,但它确实封装了对象实例化.
如果不是“工厂”,那是什么?
编辑
许多人认为这实际上是建造者模式。
来自dofactory的Builder Pattern的定义如下:
将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。
这似乎也有点牵强。困扰我的是“不同的表示”。我的目的不是抽象构建视图的过程(不是说这不是一个有价值的目标)。我只是试图将创建特定视图的逻辑放在一个地方,这样如果创建该视图的任何成分或过程发生变化,我只需更改这一类。构建器模式似乎真的是在说,“让我们为创建视图创建一个通用过程,然后您可以为创建的任何视图遵循相同的基本过程。”很好,但这不是我在这里做的。
编辑 2
我刚刚在Wikipedia article on Dependency Injection 中发现了一个有趣的例子。
在“手动注入的依赖”下,它包含以下类:
public class CarFactory {
public static Car buildCar() {
return new Car(new SimpleEngine());
}
}
这几乎是完全我的用法(而且,不,我没有写维基文章:))。
有趣的是,这是这段代码后面的注释:
在上面的代码中,工厂负责组装汽车,并将发动机注入汽车。这使汽车无需了解如何创建引擎,尽管现在 CarFactory 必须了解引擎的构造。可以创建一个 EngineFactory,但这只会在工厂之间创建依赖关系。所以问题仍然存在,但至少已经转移到 factories 或 builder 对象中。 [我的重点]
所以,这告诉我,至少我不是唯一一个想创建一个类来帮助将东西注入另一个类的人,也不是唯一一个试图将这个类命名为工厂的人。
【问题讨论】:
-
不要吹毛求疵,但您可以将方法重命名为 Create 或 CreateSetupView。
-
如果这就是你想要完成的全部,那么它并不是真正的任何模式,只是在一些顶级课程中更新所有内容。称它为工厂是错误的。
-
听起来像实例构造器模式。
标签: c# naming-conventions design-patterns factory