为什么工厂方法是一个类模式,而一个抽象工厂是一个对象模式?

Tim*_*Tim 8 oop design-patterns factory-method abstract-factory

来自GOF书:

类模式处理类及其子类之间的关系.这些关系是通过继承建立的,因此它们在编译时是静态修复的.对象模式 处理对象关系,可以在运行时更改它们并且更加动态.几乎所有模式都在某种程度上使用继承.所以标记为"类模式"的唯一模式是那些关注类关系的模式.

为什么工厂方法是一个类模式,而抽象工厂是一个对象模式,因为它们似乎是非常相似的模式?

谢谢.

Ren*_*ink 1

GOF书上说

意图

定义一个用于创建对象的接口,但让子类决定实例化哪个类。

这是什么意思?让我们看一下书中展示的示例。

设计模式,GOF - 工厂方法

在示例中,框架定义了Application接口以让其他人实现它。这意味着我可以实现例如 aMyApplicationMyOtherApplication这样的:

public class MyApplication extends Application {
    protected Document createDocument() {
        return new MyDocument();
    }
}


public class MyOtherApplication extends Application {
    protected Document createDocument() {
        return new MyOtherDocument();
    }
}
Run Code Online (Sandbox Code Playgroud)

当框架启动时,它可能会根据在类路径上找到的内容选择这些实现之一。

但这意味着在框架实例化之后,MyApplication或者MyOtherApplication创建文档的方式是固定的。在实例的运行时,不能再更改文档的创建方式Application没有设置器或其他任何东西可以用来更改Document创建方式。因此它也被称为虚拟构造函数,因此它是一种类模式

抽象工厂

与工厂方法相反,抽象工厂可以在运行时更改,从而更改它创建对象的方式。这就是为什么他们说它是对象模式

抽象工厂还负责创建

...相关或依赖对象的族...

这也是与工厂方法的区别。虚拟构造函数