Java 设计模式之工厂方法模式

设计模式系列

创建型设计模式

结构型设计模式

前言

上一讲我们聊了 ,这一讲我们聊一聊 “静态工厂方法模式” 的进阶版—— “工厂方法模式”(如果上一讲的文章还没看,请 )。

工厂方法模式,与下一讲我们要聊的 “抽象工厂模式”,都隶属于 GOF 提出的 23 种设计模式。虽然听起来好像高级一点,可看了上一讲的同学会发现,本讲的工厂方法模式实在太简单!

定义

很官方:定义一个用于创建对象的接口,让子类决定实例化哪个类。

很通俗:工厂不是上一讲中的那个简单的工厂类了,会有一个接口或者抽象类做他爸爸,他爸爸规定了他要生产什么类型的产品,他负责生产具体的产品。

我们还是结合示例来理解吧!

示例


场景

随着小 A 的月饼生意越来越好,小 A 决定扩大规模,明确分工。具体来说就是开两家月饼工厂,一家专门生产五仁月饼,另一家专门生产豆沙月饼。可是,无论几家工厂,都是生产月饼的,这是他们的抽象行为。

下面我们来看下 UML 类图,明确类间的关系。

UML类图

图 1 工厂方法模式的 UML 类图


程序代码

月饼抽象类 Mooncakes 、具体的五仁月饼类 FiveKernel 和 豆沙月饼类 Beansand 的代码与上一讲中完全一致,这里不再赘述。

将上一讲中的非抽象类 MooncakesFactory 修改抽象类,定义月饼工厂的抽象行为。


程序清单 1 月饼工厂抽象类 MooncakesFactory
public abstract class MooncakesFactory {

    public abstract Mooncakes makeMooncakes();

}

工厂抽象类定义了统一行为:生产月饼。而具体生产什么类型的月饼,则交给工厂子类来实现。


程序清单 2 五仁月饼工厂类 FivekernelFactory
public class FivekernelFactory extends MooncakesFactory {

    @Override
    public Mooncakes makeMooncakes() {
        return new FiveKernel();
    }
    
}

程序清单 3 豆沙月饼工厂类 BeansandFactory
public class BeansandFactory extends MooncakesFactory {

    @Override
    public Mooncakes makeMooncakes() {
        return new Beansand();
    }
    
}

再看一下调用方代码:
程序清单 4 生产月饼
public class Main {
    public static void main(String[] args) {
        // 五仁
        MooncakesFactory fivekernelFactory = new FivekernelFactory();
        fivekernelFactory.makeMooncakes().eat();

        // 豆沙
        MooncakesFactory beansandFactory = new BeansandFactory();
        beansandFactory.makeMooncakes().eat();
    }
}

结果示例,如图 2:
图 1 结果示例

总结

至此,本讲对工厂方法模式的介绍基本就结束了。

大家对比后可能会觉得,如果我们自己写代码的话,好像还是上一讲的静态工厂方法模式更好用一些,一是简单,二是通过反射生成相应的产品类也十分方便。

而本讲的工厂方法模式,实际上应用很广泛。

比如说大家可以看看 Java 中的集合,List 和 Set 都间接实现了 Iterable 接口,Iterable 接口中声明了一个方法 iterator() 用于提供一款产品——迭代器 Iterator ;ArrayList 实现 iterator() 方法提供了一个迭代器 ArrayListIterator ,HashSet 实现 iterator() 方法提供了一个迭代器 newKeyIterator 。

本讲的示例源码已经放在 Gihub 上:

感谢

    《Android源码设计模式解析与实战》 何红辉 关爱民 《Android进阶之光》 刘望舒 在线绘图网站
经验分享 程序员 微信小程序 职场和发展