news 2026/4/18 6:23:40

(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/4/17 6:19:23

draw.io 默认字体太丑?用这一招瞬间变高级!

背景 draw.io 是一款简洁、高效的画图工具,但其默认可选字体较为有限:如果你想在图表中使用自己喜欢的字体(如第三方中文字体),往往会发现列表里压根找不到。要解决这一问题,必须先了解:draw.io…

作者头像 李华
网站建设 2026/4/17 17:07:41

领域驱动设计:构建业务与技术的桥梁

领域驱动设计:构建业务与技术的桥梁 【免费下载链接】geektime-books :books: 极客时间电子书 项目地址: https://gitcode.com/GitHub_Trending/ge/geektime-books 在数字化浪潮席卷各行各业的今天,我们面临着一个共同的挑战:如何在快…

作者头像 李华
网站建设 2026/4/18 3:26:08

办理无线充 FCC 认证需要准备什么材料?

无线充办理 FCC 认证需区分具体类型,若为仅含电磁感应的普通无线充(无主动射频发射),走SDoC模式;若集成蓝牙 / Wi-Fi 等无线通信功能,则需走FCC ID模式,两类认证所需材料有明确差异,…

作者头像 李华
网站建设 2026/4/18 3:25:29

算法题 设计哈希集合

设计哈希集合 问题描述 不使用任何内建的哈希表库设计一个哈希集合(HashSet)。 实现 MyHashSet 类: void add(key) 向哈希集合中插入一个值 key。bool contains(key) 返回哈希集合中是否包含这个值 key。void remove(key) 将给定值 key 从哈希…

作者头像 李华
网站建设 2026/4/17 22:41:02

如何快速掌握自主移动机器人:从入门到实战的完整指南

如何快速掌握自主移动机器人:从入门到实战的完整指南 【免费下载链接】划重点自主移动机器人导论.pdf资源介绍 《自主移动机器人导论.pdf》是一本系统梳理自主移动机器人知识的实用指南,涵盖基本概念、技术原理、发展历程及应用前景等内容。本书语言通俗…

作者头像 李华
网站建设 2026/4/18 3:26:04

C++并发编程工作窃取算法:彻底搞懂memory_order_acquire/release

案例它实现了一个基于**工作窃取算法(Work-Stealing Algorithm)**的线程池系统,这是一种优雅而高效的动态负载均衡策略。其核心思想简单而深刻:当一个线程完成了自己的任务后,它不会闲着,而是会主动去"窃取"其他仍在忙碌的线程的任务来执行。这种机制确保了所有…

作者头像 李华