前言
在介绍工厂方法模式之前,我们需要知道这个设计模式是什么,解决了什么样的问题?在上一篇博客 设计模式(Java语言)- 简单工厂模式 介绍了简单工厂模式,然后总结了简单工厂模式的缺点:
1、当新增类型时,我们不得不修改原来的工厂,这样就违背了设计模式6大原则中的 开闭原则。
2、简单工厂模式使用了静态方法来创建对象,因此无法被实现或继承,从而导致改工厂类缺少灵活性,不易拓展。
3、所有的类的创建都需要这个工厂类,因此系统已工厂类是强依赖的关系,一旦工厂类出现错误,将对整个系统产生比较大的影响。
工厂方法模式就是解决上简单工厂模式的缺点。工厂方法模式UML类图:
创建工厂方法模式步骤
1、创建抽象产品类,定义接口。
2、创建抽象工厂,定义具体工厂的接口。
3、创建具体的产品类
4、创建具体的工厂类
5、客户端调用工厂类创建对象
应用案例
本模式我们加ing继续使用创建手机作为例子来讲解。我们根据上面的步骤来完成创建手机的流程:
第一步定义抽象工厂方法:
/** * @className: IphoneFactory * @description: iphone手机工厂类 * @author: rainple * @create: 2020-01-21 20:52 **/ public class IphoneFactory implements PhoneFactory{ @Override public Phone createPhone() { Iphone iphone = new Iphone(); iphone.setName("iphone手机"); return iphone; } }
第二步创建抽奖产品类
/** * @InterfaceName: Phone * @description: 抽象手机 * @author: rainple * @create: 2020-01-21 20:48 **/ public abstract class Phone { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
第三步创建具体产品类
/** * @className: Iphone * @description: * @author: rainple * @create: 2020-01-21 20:51 **/ public class Iphone extends Phone { } /** * @className: HuaWeiPhone * @description: 华为手机 * @author: rainple * @create: 2020-01-21 20:52 **/ public class HuaWeiPhone extends Phone { }
第四步创建具体的工厂方法
/** * @className: HuaWeiFactory * @description: 华为手机工厂 * @author: rainple * @create: 2020-01-21 21:04 **/ public class HuaWeiFactory implements PhoneFactory { @Override public Phone createPhone() { HuaWeiPhone huaWeiPhone = new HuaWeiPhone(); huaWeiPhone.setName("华为手机"); return huaWeiPhone; } } /** * @className: IphoneFactory * @description: iphone手机工厂类 * @author: rainple * @create: 2020-01-21 20:52 **/ public class IphoneFactory implements PhoneFactory{ @Override public Phone createPhone() { Iphone iphone = new Iphone(); iphone.setName("iphone手机"); return iphone; } }
第五步客户端调用
/** * @className: Client * @description: 客户端 * @author: rainple * @create: 2020-01-21 21:06 **/ public class Client { public static void main(String[] args) { //iphone工厂 PhoneFactory phoneFactory = new IphoneFactory(); //创建iPhone手机 Phone phone = phoneFactory.createPhone(); System.out.println(phone.getName()); //华为工厂 phoneFactory = new HuaWeiFactory(); //创建华为手机 System.out.println(phoneFactory.createPhone().getName()); } }
总结
一、优点
1、遵循开闭原则,新增产品类时只需要增加相应的工厂以及产品即可,不需要修改原有的代码。
2、符合单一职责原则,每个工厂类只负责一种产品的创建
3、使用非静态方法来创建产品,利于后续对产品的拓展,可拓展性增加
二、缺点
- 每次增加新的产品时都需要对应的添加工厂类,当产品越来越多时系统创建类就越多,越来越复杂,不利于后期的维护。同时,类的创建和销毁可能会对系统造成一定的开销。
- 一个工厂只能创建一种产品
来源:https://www.cnblogs.com/rainple/p/12227187.html