设计模式之工厂方法模式

  • 2019 年 10 月 5 日
  • 筆記

前言

学习过简单工厂模式,知道了其优点和不足,再来看工厂方法模式就更容易掌握了,工厂方法模式解决简单工厂模式扩展不足的缺陷,就让我们看看它是如何做到的.

正文

工厂方法模式

通过定义一个用于创建对象的接口, 让子类决定创建具体哪个类,属于Java中用得最多的模式之一.

首先来看下工厂方法模式的通用类图如下

其中,抽象工厂类电定义了创建对象的抽象方法,而具体如何创建产品则有它的具体实现工厂类决定,对应的产品类则将一些公共的产品特性和行为封装成抽象类,然后继承这个抽象类根据自身需求定制.

基于类图,我们可以简单实现下工厂方法模式的代码,如下所示


优点

工厂方法具有很好扩展性,大大降低了产品类与客户端类(上图FactoryMethodLab类)之间的耦合度, 就如上面代码所示,如果有多一个具体产品类 ConcreteProduct3, 只需继承Product,然后直接就可以通过 ConcreteFactory 来创建了. 也十分利于单元测试,去除了原来简单工厂的 switch/if-else 模式.

应用场景

既然是最常见的设计模式,那么我们日常开发中,又在哪里遇到过这个模式呢? 就拿Java企业开发中最常用的框架 Spirng Framework来说, Ioc容器就是基于工厂模式来创建 Beans 和管理 Beans 的生命周期, 如 createBean, getBean()等一些方法.

虽然针对存在new一个对象的地方,都可以用上工厂方法模式,但仍需要考虑是否有必要新增一个工厂类来管理对象的创建.

使用建议

  • 需要频繁new不同对象时
  • 定制需要灵活,可扩展框架时
  • 需要对异构系统进行同构化时

往往工厂方法模式会配合与其他模式混合使用,如模板方法模式, 单例模式等的,使得代码实现更加灵活和优雅.

结语

在本文中,我们学习了工厂方法模式和基本代码实现,也感受到了与简单工厂模式的不同, 其强大的模式很大程度扩展了我们的代码,下文我们学习下更强大的抽象工厂模式.

参考

  • 《设计模式之禅》
  • Factory Patterns – Factory Method Pattern: https://www.codeproject.com/Articles/1135918/Factory-Patterns-Factory-Method-Pattern