工厂方法模式比简单工厂更灵活吗?

问题描述 投票:5回答:2

我一直在读书Head First: Design Patterns,我发现这是对设计模式的很好的介绍。但是,我对他们在第4章中提出的主张有疑问:

他们定义了如下的“ Simple Factory”模式(Java伪代码:]:>

public abstract class Product
{
// Product characteristics
// Concrete Products should subclass this    
}
public class SimpleFactory {
    public Product createProduct(){
        // Return an instance of some subclass of Product
    }
}
public class Store {
    SimpleFactory factory;
    public Product orderProduct(){
        Product product = factory.createProduct();
        // Do some manipulation on product
        return product;
    }
}

“工厂方法”的定义如下(Product类保持不变,因此省略):

public abstract class Store {
//Concrete Stores must subclass this and override createProduct()
    public abstract Product createProduct();

    public Product orderProduct(){
        Product product = createProduct();
        // Do some manipulation on product
        return product;
    } 
}

然后作者继续声称,工厂方法模式比简单工厂要灵活得多,因为尽管简单工厂是“一劳永逸的交易,但是使用工厂方法,您正在创建一个框架,让子类决定应该实现哪种实现。使用”(第135页)。

现在我不明白为什么这是真的。从我的角度来看,从某种意义上说,简单工厂在某种程度上比工厂方法更灵活:您可以对简单工厂进行子类化(而不是对商店进行子类化),以获得基本相同的行为。如果愿意,您甚至可以在运行时更改行为!我能想到的Simple Factory的唯一缺点是,当产品创建取决于Store类的状态变量时:这是作者所谓的灵活性吗?还是我错过了一些东西?

我一直在阅读《 Head First:设计模式》一书,发现这是对设计模式的很好介绍。但是,我对他们在第4章中提出的主张有疑问:他们定义了...
java design-patterns factory factory-pattern
2个回答
3
投票
您完全正确:作者的假设是您不会继承SimpleFactory的子类,这不是一个合理的假设(除非SimpleFactory标记为final)。

由于SimpleFactory不是最终的,因此您可以肯定地对其进行子类化,从而比工厂方法具有更大的灵活性,因为SimpleFactory用组成替换了继承。


0
投票
在Simple Factory中,您编写了一个类,该类提供了非常强大的封装,但是只能做一件事:封装对象的创建和基础类型。虽然Factory Method模式可充分利用此类的优势:它完成了Simple Factory的操作[,但它还封装了创建过程,不仅可以创建“原始新对象”,还可以创建可交付的/完全装备的结果,这就是为什么它不仅将orderProduct称为createProduct
© www.soinside.com 2019 - 2024. All rights reserved.