news 2026/5/21 22:44:23

(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/5/21 21:41:23

Waymo Open Dataset 从入门到精通:自动驾驶数据实践终极指南

Waymo Open Dataset 作为业界领先的自动驾驶数据集,为研究社区提供了丰富的感知数据和运动预测数据,是开展自动驾驶技术研究的理想起点。本指南将带您快速掌握这一强大工具,从环境配置到实战应用,全面解析数据集的核心价值。 【免…

作者头像 李华
网站建设 2026/5/22 17:48:59

Stacer:Linux系统优化与网络共享的一站式解决方案

Stacer:Linux系统优化与网络共享的一站式解决方案 【免费下载链接】Stacer Linux System Optimizer and Monitoring - https://oguzhaninan.github.io/Stacer-Web 项目地址: https://gitcode.com/gh_mirrors/st/Stacer 作为Linux用户,您是否曾经为…

作者头像 李华
网站建设 2026/5/22 10:01:48

5个步骤快速上手:法律大模型应用完全指南

5个步骤快速上手:法律大模型应用完全指南 【免费下载链接】Awesome-Chinese-LLM 整理开源的中文大语言模型,以规模较小、可私有化部署、训练成本较低的模型为主,包括底座模型,垂直领域微调及应用,数据集与教程等。 项…

作者头像 李华
网站建设 2026/5/20 9:17:40

基于多传感信息融合定位的水下机器人系统设计与应用技术研究

基于多传感信息融合定位的水下机器人系统设计与应用技术研究 摘要 本文针对水下机器人定位精度不足的问题,设计了一套基于多传感信息融合的定位系统。系统融合了惯性导航系统(INS)、多普勒速度计程仪(DVL)、深度传感器和超短基线定位系统(USBL)等多种传感器数据,通过卡尔曼…

作者头像 李华