工厂方法模式与组合模式

Ori*_*ski 4 java design-patterns factory-pattern

来自 GoF 关于工厂方法模式的章节:

定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法让类将实例化推迟到子类。

其思想是让子类决定实例化哪个类,而GoF对这一思想的实现,就是在超类中提供一个抽象方法,子类需要重写该方法,从而提供自己的实例化逻辑。

我不明白的是,为什么使用抽象方法来实现它,而不是使用作为工厂的类成员。我会解释一下。

这是 GoF 的方式:

public abstract class Creator {
    public void doStuff() {
        Product product = createProduct();
        /* etc. */
    }

    public abstract Product createProduct();
}
Run Code Online (Sandbox Code Playgroud)

用法:

    MyCreator myCreator = new Creator() {
        @Override
        public Product createProduct() {
            return new MyProduct();
        }
    }

    myCreator.doStuff();
Run Code Online (Sandbox Code Playgroud)

但为什么要费心子类化等呢?我建议这种方法:

public class Creator {
    private Factory factory;

    /* constructor */
    public Creator(Factory factory) {
        this.factory = factory;
    }

    public void doStuff() {
        Product product = factory.createProduct();
        /* etc. */
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是你如何使用它:

    MyFactory myFactory = new MyFactory();
    Creator creator = new Creator(myFactory);
    creator.doStuff();
Run Code Online (Sandbox Code Playgroud)

那么 GoF 的方法有什么好处呢?为什么不将Factory组合到Creator类中而不是使用抽象方法来表达它呢?

小智 5

为什么不将 Factory 组合到 Creator 类中而不是使用抽象方法来表达它呢?

因为在这种情况下,客户端“知道”要实例化什么工厂类,这违背了模式的整个目的。整个想法是,客户端不知道构建了什么工厂,它只调用一个抽象类。认为您将一些第三方工厂提供商插入到您的框架中,并且您不知道他们实例化什么(也不关心),只要服务于目的即可。