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

创建型:抽象工厂模式

目录

1、核心思想

2、实现方式

2.1 模式结构

2.2 实现案例

3、优缺点分析

4、适用场景


1、核心思想

目的:统一管理相关对象的创建,确保产品兼容性。优先用于需要强约束产品兼容性的场景(如UI主题、跨平台适配)

概念:抽象工厂模式是工厂方法模式的扩展,适用于需要生成产品家族的场景。抽象工厂模式一定是基于产品的族系划分(一组功能相关或依赖的对象)来布局的,其产品系列一定是相对固定的,故以抽象工厂来确立工业制造标准(各产品系列生产接口)​。

举例:以汽车工厂举例,按品牌划分为A工厂和B工厂(两个族系),这两个品牌都有轿车、越野车、跑车3个系列的产品。基于这两个品牌的汽车工厂的系列生产线,如果以后加入新的C品牌汽车、D品牌汽车等,都可以沿用此种规划好的生产模式,这便是抽象工厂模式的基础数据模型。


 

2、实现方式

2.1 模式结构

四个核心角色:

  • 抽象产品(AbstractProduct):定义一类产品的接口(如 轿车、越野、跑车)。

  • 具体产品(ConcreteProduct):实现抽象产品接口的类(如 A品牌轿车B品牌轿车...)。

  • 抽象工厂(AbstractFactory):声明创建产品族中每个产品的方法(如 create轿车()create越野()create跑车())。

  • 具体工厂(ConcreteFactory):实现抽象工厂接口,生成同一产品族的具体对象(如A品牌工厂、B品牌工厂)。

2.2 实现案例

// 1、抽象产品
// 轿车
public interface Car {void runCar();
}
// 越野车
public interface SuvCar {void runSuvCar();
}
// 跑车
public interface SportsCar {void runSportsCar();
}// 2、具体产品
// A品牌轿车
public class ABrandCar implements Car{@Overridepublic void runCar() {System.out.println("A品牌轿车运行");}
}
// A品牌越野车
public class ABrandSuvCar implements SuvCar {@Overridepublic void runSuvCar () {System.out.println("A品牌越野车运行");}
}
// A品牌跑车
public class ABrandSportsCar implements SportsCar {@Overridepublic void runSportsCar () {System.out.println("A品牌跑车运行");}
}
// B品牌轿车
public class BBrandCar implements Car{@Overridepublic void runCar() {System.out.println("B品牌轿车运行");}
}
// B品牌越野车
public class BBrandSuvCar implements SuvCar {@Overridepublic void runSuvCar () {System.out.println("B品牌越野车运行");}
}
// B品牌跑车
public class BBrandSportsCar implements SportsCar {@Overridepublic void runSportsCar () {System.out.println("B品牌跑车运行");}
}// 3、抽象工厂
public interface BrandFactory {Car createCar();SuvCar createSuvCar();SportsCar createSportsCar();
}// 4、具体工厂
// A品牌工厂
public class ABrandFactory implements BrandFactory{@Overridepublic Car createCar() {return new ABrandCar();}@Overridepublic SuvCar createSuvCar() {return new ABrandSuvCar();}@Overridepublic SportsCar createSportsCar() {return new ABrandSportsCar();}
}
// B品牌工厂
public class BBrandFactory implements BrandFactory{@Overridepublic Car createCar() {return new BBrandCar();}@Overridepublic SuvCar createSuvCar() {return new BBrandSuvCar();}@Overridepublic SportsCar createSportsCar() {return new BBrandSportsCar();}
}// 5、客户端
public class Application {public static void main(String[] args) {BrandFactory factory = new ABrandFactory();factory.createCar();factory.createSuvCar();factory.createSportsCar();factory = new BBrandFactory();factory.createCar();factory.createSuvCar();factory.createSportsCar();}
}

3、优缺点分析

优点缺点
保证产品族兼容性新增产品类型需修改所有工厂接口
客户端与具体类解耦代码复杂度高(类数量成倍增加)
支持灵活切换产品族(如切换主题)难以扩展新产品(违反开闭原则)

工厂方法模式与抽象工厂模式对比

维度工厂方法模式抽象工厂模式
核心目的创建单一类型对象创建相关/依赖的对象家族
产品维度处理一个产品等级结构(垂直方向)处理多个产品等级结构(水平方向)
接口复杂度单一工厂方法包含多个工厂方法的接口
扩展方向新增产品类型需修改代码新增产品家族易扩展,新增产品类型难
典型应用场景日志记录器、数据库连接器等单一产品场景跨平台UI组件、主题系统等系列产品场景
子类数量每个产品对应一个子类工厂每个产品家族对应一个子类工厂

4、适用场景

  • 跨平台应用:跨平台UI组件开发(Windows/Mac风格)

  • 主题系统:切换整体风格(如深色/浅色主题)。

  • 数据库兼容:企业级应用的多数据库适配(连接器+查询器+事务管理器)

  • 游戏开发:游戏引擎的多主题支持(中世纪/科幻风格)

http://www.xdnf.cn/news/7334.html

相关文章:

  • 【RAG系统高效召回2】[特殊字符] 提升 RAG 系统检索质量的六大策略:从 top-k 到索引扩展
  • SpringBoot-1-入门概念介绍和第一个Spring Boot项目
  • 如何在LVGL之外的线程更新UI内容
  • 《Linux服务与安全管理》| DNS服务器安装和配置
  • 进程退出 和 僵尸进程、孤儿进程
  • 电子电路原理第十六章(负反馈)
  • 打卡第二十二天
  • 鸿蒙PC操作系统:从Linux到自研微内核的蜕变
  • Vue 3 项目开发 MinIO 文件管理模块
  • 数字图像处理——图像压缩
  • ai agent(智能体)开发 python高级应用8:crawl4ai 对用 LLMExtractionStrategy 和 python的 re 如何选择
  • 【C++】19. set和map的使用
  • Vue.js---立即执行的watch与回调执行时机
  • 【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs)
  • 支持python的单片机有哪些
  • 高防CDN:让攻击流量“一键清零“的智能防御之道
  • 动态页面采集技术
  • Spring Boot入门案例(Spring Initializr方式,IDEA版)
  • 新时代的可观测性:拥抱 GuanceDB 3.0
  • 前端的面试笔记——HTMLJavaScript篇(二)前端页面性能检测
  • 2025B卷 - 华为OD机试七日集训第2期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
  • 192环境记录 zlm2
  • 大小端模式和消息的加密解密
  • IPV4详解和ensp基础命令
  • C#学习9——接口、抽象类
  • Web3:Ubuntu系统 使用Docker-compose方式部署blockscout浏览器配置版本-v5.2.3-beta+charts图表
  • 2025ICPC邀请赛南昌游记
  • 架构演变 -单体到云原生
  • C++学习:六个月从基础到就业——C++20:范围(Ranges)进阶
  • 高速光耦在通信行业的应用(六) | 5Mbps通信光耦的应用