前言
在介绍工厂方法模式之前,我们需要知道这个设计模式是什么,解决了什么样的问题?在上一篇博客 设计模式(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、使用非静态方法来创建产品,利于后续对产品的拓展,可拓展性增加
二、缺点
-
每次增加新的产品时都需要对应的添加工厂类,当产品越来越多时系统创建类就越多,越来越复杂,不利于后期的维护。同时,类的创建和销毁可能会对系统造成一定的开销。
-
一个工厂只能创建一种产品
喜欢我写的博客的同学可以关注订阅号【Java解忧杂货铺】,里面不定期发布一些技术干活,也可以免费获取大量最新最流行的技术教学视频