【问题标题】:"Factory Method" Design Pattern“工厂方法”设计模式
【发布时间】:2015-04-10 13:11:41
【问题描述】:

我正在尝试理解一种非常常用的模式,称为“工厂方法”。为什么叫“方法”?

另外,“抽象工厂”模式和“工厂方法”模式有什么区别?

【问题讨论】:

标签: c# design-patterns architecture factory


【解决方案1】:

之所以称为“方法”,是因为工厂本身就是类的某个方法,通常是静态方法。例如,Monster 类可以有一个名为 Create 的方法,它会创建一些 Monster 或 Monster 的子类型。

如果类Monster是抽象类并且有一个工厂方法,那么你可以称它为抽象工厂,因为你可以通过调用它的工厂方法来实例化子类型。

这一切背后的原因是您将决定返回哪个确切子类型的决定委托给工厂,具体取决于上下文或其他什么。

C# 中的示例:

public abstract class Monster {
    public static Monster Create() {  // "Create" could have some parameters if needed.
        return new CuteMonster(); // you could change this without having to change client code.
    }
}

【讨论】:

  • 虽然我同意并赞成您对工厂方法的回答,但我不同意您对抽象工厂的回答。 “抽象工厂模式的本质是“提供一个接口来创建相关或依赖对象的系列,而无需指定它们的具体类。”我的理解是抽象工厂的“抽象”部分与工厂有关,而不是与产品有关。
  • @DavidOsborne 我想我们说的是同一件事。看我添加的示例代码:工厂是抽象的,方法不是,决策客户端代码没有指定子类(甚至都不能),因为这个决策是被抽象工厂类封装的。请注意,我没有调用类 MonsterFactory,但我认为这是一个有效的选择。