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

创建型:抽象工厂模式

目录

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风格)

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

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

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

相关文章:

  • C#:多线程
  • Ubuntu Desktop QEMU/KVM中使用Ubuntu Server 22.04配置k8s集群
  • 阿里云web端直播(前端部分)
  • 最小质因子之和(JAVA)线性筛
  • 王树森推荐系统公开课 排序03:预估分数融合
  • java bean 和map相互转换
  • 蓝桥杯国赛第十五届(JAVAB组)
  • 基于 STC89C52 的料仓物位监测系统设计与实现
  • 如何映射 MongoDB 的 _id 字段?
  • uWSGI、IIS、Tomcat有啥区别?
  • 通过低功耗蓝牙通信实例讲透 MCU 各个定时器
  • Hi3516CV610车牌识别算法源码之——实时从sensor采集视频 识别车牌
  • 万用表如何区分零线、火线、地线
  • 机器学习EM算法原理及推导
  • 3.2.1
  • super关键字
  • 测试--自动化测试函数
  • 会议动态|第十五届亚太燃烧学术年会精彩探析
  • 安装Anaconda后无jupyter解决方法
  • 新时代的可观测性:拥抱 GuanceDB 3.0
  • 研究显示:肺活量衰减始于20至25岁
  • 大语言模型在线辩论说服力比人类辩手高出64%
  • 世卫大会拒绝涉台提案,外交部:坚持一个中国原则是人心所向
  • 前四月国家铁路发送货物12.99亿吨,同比增长3.6%
  • 铜川耀州窑遗址内违法矿场存在多年,省市区文物部门多次处罚叫停仍在生产
  • 左手免费午餐右手花开岭,邓飞14年公益之路的中国贡献