工厂方法模式(Factory method pattern)是指定义一个创建对象的工厂接口,但让实现这个接口的类来决定实例化哪个类工厂方法让类的实例化推迟到子类中进行。在工厂方法模式中用户只需要关心所需产品对应的工厂,无须关心创建细节,而且加入新的产品符合开闭原则,并且每个工厂只能创建自己的产品,职责划分也更明确了,符合单一职责原则。
再以我们的造手机为例,之前的简单工厂,既需要创建苹果手机,也要创建华为、小米手机,到了工厂方法中,我们需要把各自品牌的工厂划分开来,有没有觉得很像工厂分家了,都自建工厂了。
首先我们抽象一个工厂,手机生产的工厂:
/** * 工厂方法 */ public interface PhoneFactory { Phone createPhone(); }
创建一个苹果工厂,实现手机工厂:
public class AplleFactory implements PhoneFactory{ @Override public Phone createPhone() { return new Apple(); } }
创建一个华为工厂,实现手机工厂:
public class HuaweiFactory implements PhoneFactory { @Override public Phone createPhone() { return new Huawei(); } }
创建一个小米工厂,实现手机工厂:
public class XiaomiFactory implements PhoneFactory { @Override public Phone createPhone() { return new Xiaomi(); } }
测试类,通过华为工厂来创建华为手机:
public class FactoryMethodTest { public static void main(String[] args) { PhoneFactory factory = new HuaweiFactory(); Phone phone = factory.createPhone(); phone.call(); } }
运行结果如下:
这样我们就完成了一个工厂方法模式,来看一下类图:
对比可知,相比较简单工厂复杂了不少,且随着品牌的增加,类的个数容易过多,也增加了系统的复杂度,理解起来也相对困难。但是存在即合理,满足开闭原则和单一职责原则,在系统的后期维护上,肯定比简单工厂要好,当然各位看官也要权衡是否真的适合当前的场景?有时候简单工厂会更适用。