news 2026/7/4 20:48:42

(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/7/4 15:18:28

从开发转到安全渗透工程师,是我做的最对的决定

开发是我不想重复的路 早几年都流行学计算机,传言就业薪资高,就选了软件开发专业。 在学校也不算混子吧,该学的java、python、前端操作系统都学了,不过大学的基础大家都懂,大学期间贪玩,老师在上面讲课&a…

作者头像 李华
网站建设 2026/7/1 19:59:54

60亿消息表如何分库分表?

引言“运营给了半年规划 ——DAU 要冲 30 万,到时候每天的对话消息量估计得超 5 千万,现在这张 message 表撑不住啊!”周一的技术评审会上,后端组长老张说:当前 message 表数据量不到 9 千万,但按日增 5 千…

作者头像 李华
网站建设 2026/7/2 14:02:56

干货分享,大厂内部压测方案设计

01 为什么要做压测 1、什么是压力测试? 不断向被测对象施加压力,测试系统在压力情况下的表现。 2、压力测试的目的是什么? 测试得出系统的极限性能指标,从而给出合理的承诺值或者容量告警; 找出系统的性能瓶颈&am…

作者头像 李华
网站建设 2026/7/3 14:35:27

Python_work3

使用os和os.path以及函数的递归完成: 给出一个路径,遍历当前路径所有的文件及文件夹 打印输出所有的文件(遇到文件输出路径,遇到文件夹继续进文件夹)代码 import os.path as path import os file_path_dir "E:\\A云计算\\2…

作者头像 李华
网站建设 2026/7/4 11:27:02

AFLplusplus模糊测试实战:10个高效调试技巧解决常见问题

AFLplusplus作为业界领先的模糊测试框架,在软件质量保障中发挥着关键作用。然而在实际应用中,许多用户会遇到执行效率低下、崩溃分析困难、路径覆盖不足等挑战。本文将通过10个实用技巧,帮助你快速定位并解决这些模糊测试难题。 【免费下载链…

作者头像 李华
网站建设 2026/7/1 21:26:37

探索三电平T型LCL并网逆变器的双闭环PI + SVPWM控制仿真之旅

基于三电平T型LCL并网逆变器的双闭环PISVPWM控制 Matlab/simulink仿真(2018a及以上版本),在电力电子领域,逆变器控制技术一直是研究的热门方向。今天咱就来唠唠基于三电平T型LCL并网逆变器的双闭环PI SVPWM控制,并且借助Matlab/Simulink&…

作者头像 李华