Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)

工厂方法模式(Factory Method)

概念

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

模式结构

Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)

代码解析

跟上一节简单工厂模式一样,先创建一个产生水果的接口
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)
再创建两个具体类继承接口
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)
创建一个接口工厂生产水果,这个工厂不直接有实现方法,而是分散到各个子工厂。
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)
创建两个工厂的子工厂产生苹果和梨
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)
测试一下:
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)

现在如果向增加一个产生梨,直接创建一个梨的具体类和生产梨的工厂,不需要修改产生水果的工厂。
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)
直接测试:
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)
弥补了弥补了简单工厂的不足。(开闭原则)

简单工厂模式对比

先回到简单工厂模式中的水果的例子中,如果我们需要增加新的水果梨,我们需要新增梨的子类,并且在工厂方法中加入Case语句来判断。这显然违背了开放-封闭原则。

因此工厂方法模式根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后所有的要生产具体类的工厂就去实现这个接口,这样,一个简单工厂模式的工厂类变成了一个工厂抽象接口和多个具体生产对象的工厂。

如下图所示:
Java设计模式之 工厂方法模式(Factory Method)(概念、代码解析、工厂模式与简单工厂模式的区别)