设计模式-工厂方法模式(Factory Method Pattern)
设计模式-工厂方法模式(Factory Method Pattern)
概要
记忆关键词:子类决定实例化
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
分析:
工厂方法模式结构图如下:
一、能解决什么问题?
二、涉及的角色
1. 抽象接口
统一的抽象类,代码示例:
1 public interface Phone { 4 void make(); 7 }
2. 具体实现类
实现接口的具体功能实现类,代码示例:
1 public class Iphone implements Phone{ 2 public Iphone() { 3 this.make(); 4 } 5 6 @Override 7 public void make() { 8 // TODO Auto-generated method stub 9 System.out.println("make iphone!"); 10 } 11 } 12 13 14 public class MiPhone implements Phone{ 15 public MiPhone() { 16 this.make(); 17 } 18 19 @Override 20 public void make() { 21 // TODO Auto-generated method stub 22 System.out.println("make xiaomi phone!"); 23 } 24 }
3. 工厂类接口
1 public interface AbstractFactory { 5 Phone makePhone(); 9 }
4. 工厂类子类
1 public class AppleFactory implements AbstractFactory{ 2 @Override 3 public Phone makePhone() { 4 return new Iphone(); 5 } 6 } 7 8 9 public class XiaoMiFactory implements AbstractFactory{ 10 @Override 11 public Phone makePhone() { 12 return new MiPhone(); 13 } 14 }
客户端类:
1 public static void main(String[] args) { 2 AbstractFactory miFactory = new XiaoMiFactory(); 3 AbstractFactory appleFactory = new AppleFactory(); 4 miFactory.makePhone(); // make xiaomi phone! 5 appleFactory.makePhone(); // make iphone! 6 }
三、优缺点分析
1. 优点
工厂方法克服了简单工厂违背了开放-封闭原则的缺点,又保持了封装对象创建过程的优点
集中封装了对象的创建,使得更换对象时,不需要做大的改动就可以实现,降低了客户程序与产品对象的耦合
2. 缺点
每增加一个产品,就需要加一个产品工厂的类,增加了额外的开发量
四、工厂方法模式和简单工厂模式的区别
以计算器为例,先通过两者的UML类图看下区别
简单工厂UML结构图:
工厂方法UML结构图:
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
工厂方法模式中,每一个子类对对应一个工厂子类,利用多态特性动态创建对象。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来生成实例,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。
如果要添加功能,本来是要改工厂类的,而现在是修改客户端。
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂。
五、客户端选择判断的问题
利用反射可以避免客户端分支判断的问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)