当前位置: 首页 > news >正文

四.抽象工厂模式

一.抽象工厂模式的定义

提供一个接口用于创建‌相关或依赖对象的家族‌,而无需指定具体类。客户端通过抽象接口获取对象,与具体实现解耦。

  • 强调‌产品族一致性‌
  • 与工厂方法模式区别:‌抽象工厂生产多类产品,工厂方法生产单类产品

二.核心结构

角色职责
抽象工厂声明创建产品族的方法
具体工厂实现接口,生成特定产品族对象
抽象产品定义产品接口
具体产品实现产品接口

三.案例

        通俗来讲,抽象工厂模式是多个工厂方法模式组合起来,是它的升级版。它定义了一个工厂接口或抽象类,这个工厂可以创建一组相关或依赖对象的家族(比如;发动机、轮胎等等组合起来才是一辆汽车),每个具体工厂实现这个接口时,都会为这一组产品提供各自的实现。这组产品中的每一个对象,都可以看作是一个独立的“工厂方法模式”的产物。

工厂方法模式适用于单一产品的创建,抽象工厂模式适用于一组相关产品的创建。

// 抽象产品:发动机
interface Engine {void start();
}// Tesla专用发动机
class ElectricEngine implements Engine {public void start() { System.out.println("特斯拉电机启动 - 无声运转"); }
}// Toyota专用发动机
class CombustionEngine implements Engine {public void start() { System.out.println("丰田发动机启动 - 引擎轰鸣"); }
}// 抽象产品:轮胎
interface Tire {void grip();
}// Tesla专用轮胎
class SportTire implements Tire {public void grip() { System.out.println("运动轮胎 - 赛道级抓地力"); }
}// Toyota专用轮胎
class AllWeatherTire implements Tire {public void grip() { System.out.println("全气候轮胎 - 全天候安全保障"); }
}// 抽象工厂:生产配套产品族
interface CarFactory {Engine createEngine();  // 不再单一!Tire createTire();      // 多产品协同生产
}// Tesla产品族工厂
class TeslaFactory implements CarFactory {public Engine createEngine() {return new ElectricEngine();  //电动车专用电机}public Tire createTire() {return new SportTire();       //性能轮胎}
}// Toyota产品族工厂
class ToyotaFactory implements CarFactory {public Engine createEngine() {return new CombustionEngine(); //燃油发动机}public Tire createTire() {return new AllWeatherTire();   //全天候轮胎}
}public class CarAssembly {public static void main(String[] args) {// 根据需求选择完整产品族CarFactory factory = selectFactory("eco"); // 配套产品自动组合(无需手动匹配)Engine engine = factory.createEngine();Tire tire = factory.createTire();// 确保兼容性:Tesla电机不会配错丰田轮胎engine.start();tire.grip();}private static CarFactory selectFactory(String mode) {return "eco".equals(mode) ? new TeslaFactory() :   // 整套电动车方案new ToyotaFactory();   // 整套燃油车方案}
}

四.应用场景

抽象工厂模式和工厂方法模式的应用场景一直,但它们适用的“粒度”和“复杂度”不同。

例如:多支付渠道系统

工厂方式模式可以创建支付接口。但是如果需要支付接口、回调处理器、日志记录器时,就需要抽象工厂模式。

💡 如果本文对你有帮助,点击右上角【订阅专栏】或左上角关注我  
🔔 完整的23中设计模式干货,第一时间推送给你!
🔔 有什么问题也可以在评论区讨论🤝🤝🤝

相关文章:

  • 如何在Spring Boot中使用注解动态切换实现
  • Kubernetes 节点资源驱逐策略详解:evictionHard 与 evictionSoft
  • remote display server is not supported (e.g. Wayland)
  • Vue中虚拟DOM的原理与作用
  • 【RTP】Intra-Refresh模式下的 H.264 输出,RTP打包的方式和普通 H.264 流并没有本质区别
  • python批量将文件夹下的excel转word文件
  • 海思Hi3798MV310_V39_HMS DDR3_安卓9.0_外贸盒update升级包
  • 深入了解NIO的优化实现原理
  • Linux运维新人自用笔记(乌班图apt命令和dpkg命令、两系统指令区别,rpm解决路径依赖、免安装配置java环境)
  • 发送文件脚本源码版本
  • 【Go语言基础【17】】切片:一种动态数组
  • 漏洞检测方案如何选工具?开源与商业工具适用环境大不同
  • Ubuntu系统用户基本管理
  • 栈和队列的奇妙冒险:用栈实现队列
  • (每日一道算法题)验证二叉搜索树
  • Jinja2深度解析与应用指南
  • ALOHA ACT算法与源码笔记
  • 【学习笔记】0-RTT
  • 简约商务通用宣传年终总结12套PPT模版分享
  • LLMs 系列科普文(13)
  • 做jsp网站用哪些软件下载/磁力天堂最新版地址
  • 网站开发进阶/搜索引擎是什么
  • 电子商务网站前台建设常用的技术有/怎么免费给自己建网站
  • 椒江网站建设578做网站/seow
  • 大型网站建设的难点是什么/深圳百度关键词
  • 企业 php网站建设/百度推广怎么收费