【问题标题】:Is the Factory Method Pattern more flexible than Simple Factory?工厂方法模式是否比简单工厂更灵活?
【发布时间】:2014-10-22 15:58:01
【问题描述】:

我一直在阅读Head First: Design Patterns 这本书,我发现这本书很好地介绍了设计模式。但是,我有一个关于他们在第 4 章中提出的声明的问题:

他们将“简单工厂”模式定义如下(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 在某种意义上比 Factory Method 稍微更加灵活:您可以将 Simple Factory 子类化(而不是 Store 子类化)以获得基本相同的行为。如果您愿意,您甚至可以在运行时更改行为!我能想到的 Simple Factory 的唯一缺点是当产品创建依赖于 Store 类的状态变量时:这是作者所说的灵活性,还是我遗漏了什么?

【问题讨论】:

    标签: java design-patterns factory factory-pattern


    【解决方案1】:

    您是绝对正确的:作者的假设是您不会继承 SimpleFactory,这是不公平的假设(除非 SimpleFactory 被标记为 final)。

    由于SimpleFactory 不是最终的,你绝对可以继承它,获得比使用工厂方法更大的灵活性,因为SimpleFactory 用组合代替了继承。

    更好的方法是让SimpleFactory 成为一个接口。这样做可以让您根据自己的喜好选择组合或继承,因为当您的 Store 类已经继承了一个类时,接口不会限制您。

    public interface SimpleFactory {
        Product createProduct();
    }
    

    那么你可以使用任一组合

    public class FactoryImpl implements SimpleFactory {
        public Product createProduct(){
            // Return an instance of some subclass of Product
        }
    }
    public class StoreComposition {
        SimpleFactory factory = new FactoryImpl();
    }
    

    或继承/组合组合

    public class StoreInheritance implements SimpleFactory {
        SimpleFactory factory = this;
        public Product createProduct(){
            // Return an instance of some subclass of Product
        }
    }
    

    【讨论】:

    • 很有趣,他们似乎首先考虑继承SimpleFactory;然后他们因为缺乏质量控制而放弃了这种方法(他们在整章中都在使用比萨店的类比)。后来他们简单地声明工厂方法是一个框架,它比简单工厂提供更多的灵活性。无论如何,谢谢你的回答!继承/组合组合有点奇怪,但它确实超级灵活!
    • 如果你继承了简单工厂,我相信你正在走向抽象工厂模式。 Larman 在他的Applying UML and Patterns 一书中将简单工厂称为“抽象工厂模式的简化”。另外,如果您继续阅读 Head First 中的内容,您会发现一个名为 这是隐藏在抽象工厂中的工厂方法吗? Freeman,Eric;罗布森,伊丽莎白;贝茨,伯特;凯西塞拉 (2004-10-25)。 Head First 设计模式(Kindle 位置 2319)。奥莱利媒体。 Kindle 版。
    【解决方案2】:

    在 Simple Factory 中,您编写了一个类,它提供了非常强大的封装,但只做一件事:封装对象的创建和底层类型。同时,工厂方法模式充分利用了这个类:它做了简单工厂所做的事情,此外,它还封装了创建过程,不仅可以创建“原始新对象”,而且可以交付/ 装备齐全的结果,这就是为什么它叫orderProduct 而不仅仅是createProduct

    简而言之,工厂方法的重点是使用简单工厂的方法。所以如果你觉得 Factory Method 不够灵活,那是因为 Factory Method 做了更多的事情!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多