news 2026/4/18 1:57:58

(15)抽象工厂模式(了解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(15)抽象工厂模式(了解)

抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。
抽象工厂模式特点:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结果。
抽象工厂中包含4个角色:

  • 抽象工厂角色
  • 具体工厂角色
  • 抽象产品角色
  • 具体产品角色

抽象工厂模式的类图如下:

抽象工厂模式代码如下:
第一部分:武器产品族

packagecom.powernode.product;/** * 武器产品族 * @author 动力节点 * @version 1.0 * @className Weapon * @since 1.0 **/publicabstractclassWeapon{publicabstractvoidattack();}
packagecom.powernode.product;/** * 武器产品族中的产品等级1 * @author 动力节点 * @version 1.0 * @className Gun * @since 1.0 **/publicclassGunextendsWeapon{@Overridepublicvoidattack(){System.out.println("开枪射击!");}}
packagecom.powernode.product;/** * 武器产品族中的产品等级2 * @author 动力节点 * @version 1.0 * @className Dagger * @since 1.0 **/publicclassDaggerextendsWeapon{@Overridepublicvoidattack(){System.out.println("砍丫的!");}}

第二部分:水果产品族

packagecom.powernode.product;/** * 水果产品族 * @author 动力节点 * @version 1.0 * @className Fruit * @since 1.0 **/publicabstractclassFruit{/** * 所有果实都有一个成熟周期。 */publicabstractvoidripeCycle();}
packagecom.powernode.product;/** * 水果产品族中的产品等级1 * @author 动力节点 * @version 1.0 * @className Orange * @since 1.0 **/publicclassOrangeextendsFruit{@OverridepublicvoidripeCycle(){System.out.println("橘子的成熟周期是10个月");}}
packagecom.powernode.product;/** * 水果产品族中的产品等级2 * @author 动力节点 * @version 1.0 * @className Apple * @since 1.0 **/publicclassAppleextendsFruit{@OverridepublicvoidripeCycle(){System.out.println("苹果的成熟周期是8个月");}}

第三部分:抽象工厂类

packagecom.powernode.factory;importcom.powernode.product.Fruit;importcom.powernode.product.Weapon;/** * 抽象工厂 * @author 动力节点 * @version 1.0 * @className AbstractFactory * @since 1.0 **/publicabstractclassAbstractFactory{publicabstractWeapongetWeapon(Stringtype);publicabstractFruitgetFruit(Stringtype);}

第四部分:具体工厂类

packagecom.powernode.factory;importcom.powernode.product.Dagger;importcom.powernode.product.Fruit;importcom.powernode.product.Gun;importcom.powernode.product.Weapon;/** * 武器族工厂 * @author 动力节点 * @version 1.0 * @className WeaponFactory * @since 1.0 **/publicclassWeaponFactoryextendsAbstractFactory{publicWeapongetWeapon(Stringtype){if(type==null||type.trim().length()==0){returnnull;}if("Gun".equals(type)){returnnewGun();}elseif("Dagger".equals(type)){returnnewDagger();}else{thrownewRuntimeException("无法生产该武器");}}@OverridepublicFruitgetFruit(Stringtype){returnnull;}}
packagecom.powernode.factory;importcom.powernode.product.*;/** * 水果族工厂 * @author 动力节点 * @version 1.0 * @className FruitFactory * @since 1.0 **/publicclassFruitFactoryextendsAbstractFactory{@OverridepublicWeapongetWeapon(Stringtype){returnnull;}publicFruitgetFruit(Stringtype){if(type==null||type.trim().length()==0){returnnull;}if("Orange".equals(type)){returnnewOrange();}elseif("Apple".equals(type)){returnnewApple();}else{thrownewRuntimeException("我家果园不产这种水果");}}}

第五部分:客户端程序

packagecom.powernode.client;importcom.powernode.factory.AbstractFactory;importcom.powernode.factory.FruitFactory;importcom.powernode.factory.WeaponFactory;importcom.powernode.product.Fruit;importcom.powernode.product.Weapon;/** * @author 动力节点 * @version 1.0 * @className Client * @since 1.0 **/publicclassClient{publicstaticvoidmain(String[]args){// 客户端调用方法时只面向AbstractFactory调用方法。AbstractFactoryfactory=newWeaponFactory();// 注意:这里的new WeaponFactory()可以采用 简单工厂模式 进行隐藏。Weapongun=factory.getWeapon("Gun");Weapondagger=factory.getWeapon("Dagger");gun.attack();dagger.attack();AbstractFactoryfactory1=newFruitFactory();// 注意:这里的new FruitFactory()可以采用 简单工厂模式 进行隐藏。Fruitorange=factory1.getFruit("Orange");Fruitapple=factory1.getFruit("Apple");orange.ripeCycle();apple.ripeCycle();}}

抽象工厂模式的优缺点:

  • 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
  • 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在AbstractFactory里加代码,又要在具体的里面加代码。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱: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/11 17:19:49

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

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

作者头像 李华
网站建设 2026/4/13 15:30:57

算法题 设计哈希集合

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

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

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

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

作者头像 李华
网站建设 2026/4/16 12:35:41

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

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

作者头像 李华