“工厂方法”和“抽象工厂”之间的主要区别在于工厂方法是单一方法,而抽象工厂是对象。我认为很多人将这两个术语弄混了,并开始互换使用。我记得当我学习它们时,我很难找到确切的区别。
因为factory方法只是一个方法,所以可以在子类中覆盖它,因此引号的后半部分:
…工厂方法模式使用继承,并依赖于子类来处理所需的对象实例化。
引用假定此处对象正在调用 其自己的 工厂方法。因此,唯一可以更改返回值的是子类。
…使用Abstract Factory模式,一个类通过组合将对象实例化的责任委托给另一个对象…
他们在说的是,有一个对象A,他想制作一个Foo对象。与其创建Foo对象本身(例如,使用工厂方法),不如创建 另一个 对象(抽象工厂)来创建Foo对象。
为了说明不同之处,以下是使用的工厂方法:
class A {
public void doSomething() {
Foo f = makeFoo();
f.whatever();
}
protected Foo makeFoo() {
return new RegularFoo();
}
}
class B extends A {
protected Foo makeFoo() {
//subclass is overriding the factory method
//to return something different
return new SpecialFoo();
}
}
这是一个正在使用的抽象工厂:
class A {
private Factory factory;
public A(Factory factory) {
this.factory = factory;
}
public void doSomething() {
//The concrete class of "f" depends on the concrete class
//of the factory passed into the constructor. If you provide a
//different factory, you get a different Foo object.
Foo f = factory.makeFoo();
f.whatever();
}
}
interface Factory {
Foo makeFoo();
Bar makeBar();
Aycufcn makeAmbiguousYetCommonlyUsedFakeClassName();
}
//need to make concrete factories that implement the "Factory" interface here