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

设计模式系列

创建型设计模式

Java 设计模式之单例模式

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

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

Java 设计模式之抽象工厂模式

Java 设计模式之Builder模式

Java 设计模式之静态工厂、工厂方法、抽象工厂和 Builder 模式的区别

结构型设计模式

Java 设计模式之代理模式

Java 设计模式之外观模式

前言

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

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

定义

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

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

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

示例


场景

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

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

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() 用于提供一款产品——迭代器 IteratorArrayList 实现 iterator() 方法提供了一个迭代器 ArrayListIteratorHashSet 实现 iterator() 方法提供了一个迭代器 newKeyIterator

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

下一讲,我们来关注 Java 设计模式之抽象工厂模式

感谢

  • 《Android源码设计模式解析与实战》 何红辉 关爱民
  • 《Android进阶之光》 刘望舒
  • 在线绘图网站 ProcessOn
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值