学习过简单工厂模式,知道了其优点和不足,再来看工厂方法模式就更容易掌握了,工厂方法模式解决简单工厂模式扩展不足的缺陷,就让我们看看它是如何做到的.
通过定义一个用于创建对象的接口, 让子类决定创建具体哪个类,属于Java中用得最多的模式之一.
首先来看下工厂方法模式的通用类图如下
其中,抽象工厂类电定义了创建对象的抽象方法,而具体如何创建产品则有它的具体实现工厂类决定,对应的产品类则将一些公共的产品特性和行为封装成抽象类,然后继承这个抽象类根据自身需求定制.
基于类图,我们可以简单实现下工厂方法模式的代码,如下所示
工厂方法具有很好扩展性,大大降低了产品类与客户端类(上图FactoryMethodLab类)之间的耦合度, 就如上面代码所示,如果有多一个具体产品类 ConcreteProduct3, 只需继承Product,然后直接就可以通过 ConcreteFactory 来创建了. 也十分利于单元测试,去除了原来简单工厂的 switch/if-else 模式.
既然是最常见的设计模式,那么我们日常开发中,又在哪里遇到过这个模式呢? 就拿Java企业开发中最常用的框架 Spirng Framework来说, Ioc容器就是基于工厂模式来创建 Beans 和管理 Beans 的生命周期, 如 createBean
, getBean()
等一些方法.
虽然针对存在new一个对象的地方,都可以用上工厂方法模式,但仍需要考虑是否有必要新增一个工厂类来管理对象的创建.
往往工厂方法模式会配合与其他模式混合使用,如模板方法模式, 单例模式等的,使得代码实现更加灵活和优雅.
在本文中,我们学习了工厂方法模式和基本代码实现,也感受到了与简单工厂模式的不同, 其强大的模式很大程度扩展了我们的代码,下文我们学习下更强大的抽象工厂模式.