当前位置: 首页 > news >正文

(14)工厂方法模式

6.3 工厂方法模式

工厂方法模式既保留了简单工厂模式的优点,同时又解决了简单工厂模式的缺点。

  • 怎么解决简单工厂模式的缺点(不符合OCP开闭原则)的?
    一个工厂对应生产一种产品
    工厂方法模式的角色包括:

  • 抽象工厂角色

  • 具体工厂角色

  • 抽象产品角色

  • 具体产品角色

代码如下:

packagecom.powernode.factory;/** * 武器类(抽象产品角色) * @author 动力节点 * @version 1.0 * @className Weapon * @since 1.0 **/publicabstractclassWeapon{/** * 所有武器都有攻击行为 */publicabstractvoidattack();}
packagecom.powernode.factory;/** * 具体产品角色 * @author 动力节点 * @version 1.0 * @className Gun * @since 1.0 **/publicclassGunextendsWeapon{@Overridepublicvoidattack(){System.out.println("开枪射击!");}}
packagecom.powernode.factory;/** * 具体产品角色 * @author 动力节点 * @version 1.0 * @className Fighter * @since 1.0 **/publicclassFighterextendsWeapon{@Overridepublicvoidattack(){System.out.println("战斗机发射核弹!");}}
packagecom.powernode.factory;/** * 武器工厂接口(抽象工厂角色) * @author 动力节点 * @version 1.0 * @className WeaponFactory * @since 1.0 **/publicinterfaceWeaponFactory{Weaponget();}
packagecom.powernode.factory;/** * 具体工厂角色 * @author 动力节点 * @version 1.0 * @className GunFactory * @since 1.0 **/publicclassGunFactoryimplementsWeaponFactory{@OverridepublicWeaponget(){returnnewGun();}}
packagecom.powernode.factory;/** * 具体工厂角色 * @author 动力节点 * @version 1.0 * @className FighterFactory * @since 1.0 **/publicclassFighterFactoryimplementsWeaponFactory{@OverridepublicWeaponget(){returnnewFighter();}}

客户端程序:

packagecom.powernode.factory;/** * @author 动力节点 * @version 1.0 * @className Client * @since 1.0 **/publicclassClient{publicstaticvoidmain(String[]args){WeaponFactoryfactory=newGunFactory();Weaponweapon=factory.get();weapon.attack();WeaponFactoryfactory1=newFighterFactory();Weaponweapon1=factory1.get();weapon1.attack();}}

如果想扩展一个新的产品,只要新增一个产品类,再新增一个该产品对应的工厂即可,例如新增:匕首

packagecom.powernode.factory;/** * @author 动力节点 * @version 1.0 * @className Dagger * @since 1.0 **/publicclassDaggerextendsWeapon{@Overridepublicvoidattack(){System.out.println("砍丫的!");}}
packagecom.powernode.factory;/** * @author 动力节点 * @version 1.0 * @className DaggerFactory * @since 1.0 **/publicclassDaggerFactoryimplementsWeaponFactory{@OverridepublicWeaponget(){returnnewDagger();}}

客户端程序:

packagecom.powernode.factory;/** * @author 动力节点 * @version 1.0 * @className Client * @since 1.0 **/publicclassClient{publicstaticvoidmain(String[]args){WeaponFactoryfactory=newGunFactory();Weaponweapon=factory.get();weapon.attack();WeaponFactoryfactory1=newFighterFactory();Weaponweapon1=factory1.get();weapon1.attack();WeaponFactoryfactory2=newDaggerFactory();Weaponweapon2=factory2.get();weapon2.attack();}}

我们可以看到在进行功能扩展的时候,不需要修改之前的源代码,显然工厂方法模式符合OCP原则。
工厂方法模式的优点:

  • 一个调用者想创建一个对象,只要知道其名称就可以了。
  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  • 屏蔽产品的具体实现,调用者只关心产品的接口。

工厂方法模式的缺点:

  • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
http://www.cnnetsun.cn/news/8949.html

相关文章:

  • 从开发转到安全渗透工程师,是我做的最对的决定
  • 60亿消息表如何分库分表?
  • 干货分享,大厂内部压测方案设计
  • Python_work3
  • AFLplusplus模糊测试实战:10个高效调试技巧解决常见问题
  • 探索三电平T型LCL并网逆变器的双闭环PI + SVPWM控制仿真之旅
  • VSCode如何实时连接IBM Quantum?一文掌握核心配置参数(含实操代码)
  • python如何获取字符串最后一个字符
  • 赋能个体,智创全球——CCF 程序员大会“个人出海论坛”圆满落幕
  • 零基础学CMD:从关机命令开始的Windows命令行入门
  • Wan2.2-T2V-A14B与Runway Gen-3的技术差异全面对比
  • 为什么90%的工程师写不好Agentic Apps配置?Docker Compose权威解析
  • 【Azure量子开发权威解析】:掌握这8个考点,轻松拿下MCP认证
  • 第三方接口调用不用愁!JNPF 数据接口神技,鉴权 + 变量提取一键搞定
  • LED显示屏话筒生产厂家
  • 企业级Java开发:Eclipse定制化安装全攻略
  • 字节面试:如何测试RocketMQ、RocketMQ?测试点有哪些?
  • 访答:数字化时代的知识管理新范式
  • 基于Hadoop的游戏在线时长大数据分析系统毕业设计项目源码
  • 《智能座舱时代:车载HMI渲染引擎的选型、架构与实践》第 1 章 车载座舱对渲染的特殊要求
  • WiFi 定位的基本原理与技术
  • 测试自动化框架设计与最佳实践:构建高效测试体系的路径
  • 【高并发场景下的秘密武器】:ASP.NET Core 9 WebSocket压缩协议实战落地
  • RAG实践指南:一文搞定大模型RAG过程
  • 一份全面的AI_Agent知识地图
  • 软件、硬件的兼容性的测试,你知多少?
  • 【翻译】【SOMEIP-SD】Page37 - Page39
  • Raft算法(二)
  • 一文讲透大模型应用开发:新时代技术核心竞争力人人都能掌握!
  • 创维E900V21E/E900V21C/E900V21D/E900V22E_S905L3B_安卓9.0_当贝桌面线刷固件包