🚗工厂方法模式
前面简单工厂模式中有一个问题:一旦添加新产品不得不修改工厂逻辑(就是会去修改那个if else 或者 case语句)
那么工厂方法模式就可以解决这个问题
定义
定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
角色
- 抽象产品 Product
- 具体产品 ConcreteProduct
- 抽象工厂 Factory
- 具体工厂 ConcreteFactory
模式类图
🍓举个例子
对应的工厂生产对应的手机
类图
编写顺序(顺序不唯一)
Mobile>MiMobile>MobileFactory>MiFactory
代码
Mobile.java
public interface Mobile { //打电话 void call(); }
MiMobile.java
public class MiMobile implements Mobile { @Override public void call() { System.out.println("我的小米"); } }
MobileFactory.java
public interface MobileFactory { //生产手机 Mobile createMobile(); }
MiFactory.java
public class MiFactory implements MobileFactory { @Override public Mobile createMobile() { return new MiMobile(); } }
客户端代码
public class Client { public static void main(String[] args) { MobileFactory miFactory = new MiFactory(); Mobile miMobile = miFactory.createMobile(); miMobile.call(); //======== MobileFactory vivoFactory = new VivoFactory(); Mobile vivoMobile = vivoFactory.createMobile(); vivoMobile.call(); } }
结果
现在我们发现,我们在添加新的产品时,就不用再去修改工厂的逻辑了,而是通过对应的工厂生产对应的产品
模式优点
- 工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节
- 能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部
- 在系统中加入新产品时,完全符合开闭原则
哇偶,优点还是蛮多嘛
模式缺点
- 系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销
- 增加了系统的抽象性和理解难度
模式适用环境
- 客户端不知道它所需要的对象的类(客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建)
- 抽象工厂类通过其子类来指定创建哪个对象
好啦,就到这里啦,欢迎大家在评论区讨论工厂方法和简单工厂的区别额😘
结语