设计模式系列
创建型设计模式
Java 设计模式之静态工厂、工厂方法、抽象工厂和 Builder 模式的区别
结构型设计模式
前言
上一讲我们聊了 Java 设计模式之静态工厂方法模式,这一讲我们聊一聊 “静态工厂方法模式” 的进阶版—— “工厂方法模式”(如果上一讲的文章还没看,请 移步)。
工厂方法模式,与下一讲我们要聊的 “抽象工厂模式”,都隶属于 GOF 提出的 23 种设计模式。虽然听起来好像高级一点,可看了上一讲的同学会发现,本讲的工厂方法模式实在太简单!
定义
很官方:定义一个用于创建对象的接口,让子类决定实例化哪个类。
很通俗:工厂不是上一讲中的那个简单的工厂类了,会有一个接口或者抽象类做他爸爸,他爸爸规定了他要生产什么类型的产品,他负责生产具体的产品。
我们还是结合示例来理解吧!
示例
场景
随着小 A 的月饼生意越来越好,小 A 决定扩大规模,明确分工。具体来说就是开两家月饼工厂,一家专门生产五仁月饼,另一家专门生产豆沙月饼。可是,无论几家工厂,都是生产月饼的,这是他们的抽象行为。
下面我们来看下 UML 类图,明确类间的关系。
UML类图
程序代码
月饼抽象类 Mooncakes
、具体的五仁月饼类 FiveKernel
和 豆沙月饼类 Beansand
的代码与上一讲中完全一致,这里不再赘述。
将上一讲中的非抽象类 MooncakesFactory
修改抽象类,定义月饼工厂的抽象行为。
public abstract class MooncakesFactory {
public abstract Mooncakes makeMooncakes();
}
工厂抽象类定义了统一行为:生产月饼。而具体生产什么类型的月饼,则交给工厂子类来实现。
public class FivekernelFactory extends MooncakesFactory {
@Override
public Mooncakes makeMooncakes() {
return new FiveKernel();
}
}
public class BeansandFactory extends MooncakesFactory {
@Override
public Mooncakes makeMooncakes() {
return new Beansand();
}
}
再看一下调用方代码:
public class Main {
public static void main(String[] args) {
// 五仁
MooncakesFactory fivekernelFactory = new FivekernelFactory();
fivekernelFactory.makeMooncakes().eat();
// 豆沙
MooncakesFactory beansandFactory = new BeansandFactory();
beansandFactory.makeMooncakes().eat();
}
}
结果示例,如图 2:
总结
至此,本讲对工厂方法模式的介绍基本就结束了。
大家对比后可能会觉得,如果我们自己写代码的话,好像还是上一讲的静态工厂方法模式更好用一些,一是简单,二是通过反射生成相应的产品类也十分方便。
而本讲的工厂方法模式,实际上应用很广泛。
比如说大家可以看看 Java 中的集合,List 和 Set 都间接实现了 Iterable 接口,Iterable 接口中声明了一个方法 iterator()
用于提供一款产品——迭代器 Iterator ;ArrayList 实现 iterator()
方法提供了一个迭代器 ArrayListIterator ,HashSet 实现 iterator()
方法提供了一个迭代器 newKeyIterator 。
本讲的示例源码已经放在 Gihub 上:FactoryPattern
下一讲,我们来关注 Java 设计模式之抽象工厂模式
感谢
- 《Android源码设计模式解析与实战》 何红辉 关爱民
- 《Android进阶之光》 刘望舒
- 在线绘图网站 ProcessOn