news 2026/6/15 19:17:27

(14)工厂方法模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(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原则。
工厂方法模式的优点:

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

工厂方法模式的缺点:

  • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 14:51:29

Wan2.2-T2V-A14B如何生成带有体温检测显示的防疫宣传视频?

Wan2.2-T2V-A14B如何生成带有体温检测显示的防疫宣传视频? 你有没有想过,一条关于“地铁站测体温”的防疫宣传视频,从想法到成片只需要几分钟?🎬 不用摄影师、不用演员、不用剪辑师——只需要一句话描述,AI…

作者头像 李华
网站建设 2026/6/14 23:43:25

基于模型预测控制MPC的光伏供电的DC-AC变换器设计研究附Simulink仿真

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 🍊个人信条:格物致知,完整Matlab代码及仿真…

作者头像 李华
网站建设 2026/6/15 14:22:35

Wan2.2-T2V-A14B助力环保组织制作塑料污染警示视频

Wan2.2-T2V-A14B助力环保组织制作塑料污染警示视频 🌊 想象一下:你是一家环保组织的传播负责人,手头有一堆触目惊心的数据——每年800万吨塑料流入海洋,超过100万只海鸟因误食塑料死亡……但当你想做一支警示短片时,却…

作者头像 李华
网站建设 2026/6/15 16:50:21

Python_work2

1.猜数字 用户输入一个数字 系统产生一个随机数(0-100) 进行判断,如果猜大了/猜小了,则提示,直到猜对为止 如果猜对了,结束程序 统计所猜次数代码 # 扩展版:增加难度选择、次数限制 import randomdef guess_number_game():print…

作者头像 李华
网站建设 2026/6/15 9:40:58

3步掌握AI图像修复:零代码集成IOPaint的完整指南

3步掌握AI图像修复:零代码集成IOPaint的完整指南 【免费下载链接】IOPaint 项目地址: https://gitcode.com/GitHub_Trending/io/IOPaint 还在为图片中的水印、多余物体烦恼吗?IOPaint作为开源的AI图像修复工具,让图像编辑变得简单高效…

作者头像 李华
网站建设 2026/6/15 14:39:41

Linux命令-get_module命令(显示Linux内核模块的详细内部信息)

🧭 说明 get_module 命令用于显示Linux内核模块的详细内部信息,例如其状态、引用计数、参数以及内存中的节区(Sections)地址等。下面是一个快速用法指南。 🔍 命令语法与示例 命令的基本语法非常简单: get_…

作者头像 李华