创建型设计模式(二)抽象工厂模式
文章更新时间:2020/07/15
一、一句话背景
假如我是一个汽车经销商,那我不光是卖车,也得卖相关的配件吧,比如润滑油,轮胎之类的...
基于这个需求那我能不能整一个抽象的工厂,我需要啥直接告诉这个抽象工厂,具体生产哪一类产品让这个抽象工厂自己去对接,这样我不管需要啥都只用找这个抽象工厂的负责人就可以,而不用找每一类具体产品工厂的负责人,我可就省事多了~
二、使用场景
使用场景:调用一整套产品族的场景。
如:参加不同类型的抽奖活动,QQ换皮肤
优点:抽象工厂可以简单的理解成为其他工厂的总工厂,基于这个概念我们可以把一整套的东西再次进行抽象出来,这样调用起来就更方便了。
缺点:如果抽象工厂功能十分强大时(可创建工厂的种类很多时),工厂类中会有很多无关代码,会显得比较杂乱(工厂类继承抽象工厂,需要实现抽象工厂的抽象方法)
三、模型分析
抽象工厂:定义创建抽象产品的方法,由具体工厂去继承,生成具体产品
抽象产品:定义产品的共有属性和方法,由具体产品去继承
具体工厂:实现/继承工厂类,生产具体产品
具体产品:实现/继承抽象产品类
四、UML类图
从UML类图来看,抽象工厂模式与工厂方法模式其实大体上是差不多的,他们的区别主要在于:
区别主要在于产品。
工厂方法模式:
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类,主要是生成一类相关的产品
- 工厂模式针对的是产品单一的情况,即一个产品等级结构
抽象工厂模式:
- 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类,通常生成一系列相关的产品
- 抽象工厂模式针对的是面向多个业务品种、业务分类,即多个产品等级结构
- 抽象工厂是在工厂方法的基础上再次提炼出一层更具“通性”的工厂,使生产一类产品变为生产一系列产品
五、代码分析
抽象工厂
/** * 汽车工厂【抽象工厂】 */ public abstract class CarAbstractFactory { //组装发动机【抽象产品】 public abstract Motor packageMotor() throws Exception; //组装轮胎【抽象产品】 public abstract Tyre packageTyre() throws Exception; }
具体工厂
奥迪工厂
/** * 奥迪工厂【具体工厂】 */ public class AudiFactory extends CarAbstractFactory { //具体的属性 private Motor motor; private Tyre tyre; //组装发动机 @Override public Motor packageMotor() throws Exception { Motor motor = new AudiMotor(); this.motor = motor; return motor; } //组装轮胎 @Override public Tyre packageTyre() throws Exception { Tyre tyre = new GTYTyre(); this.tyre = tyre; return tyre; } /** * 输出汽车信息 */ public void carInfo() { System.out.println("=====获得一辆奥迪车,配置如下====="); this.motor.motorInfo(); this.tyre.tyreInfo(); } }
奔驰工厂
/** * 奔驰工厂【具体工厂】 */ public class BenzFactory extends CarAbstractFactory { //具体的属性 private Motor motor; private Tyre tyre; //组装发动机 @Override public Motor packageMotor() throws Exception { Motor motor = new BenzMotor(); this.motor = motor; return motor; } //组装轮胎 @Override public Tyre packageTyre() throws Exception { Tyre tyre = new MQLTyre(); this.tyre = tyre; return tyre; } /** * 输出汽车信息 */ public void carInfo() { System.out.println("=====获得一辆奔驰车,配置如下====="); this.motor.motorInfo(); this.tyre.tyreInfo(); } }
宝马工厂
/** * 宝马车工厂【具体工厂】 */ public class BmwFactory extends CarAbstractFactory { //具体的属性 private Motor motor; private Tyre tyre; //组装发动机 @Override public Motor packageMotor() throws Exception { Motor motor = new BmwMotor(); this.motor = motor; return motor; } //组装轮胎 @Override public Tyre packageTyre() throws Exception { Tyre tyre = new MQLTyre(); this.tyre = tyre; return tyre; } /** * 输出汽车信息 */ public void carInfo() { System.out.println("=====获得一辆宝马车,配置如下====="); this.motor.motorInfo(); this.tyre.tyreInfo(); } }
抽象产品
发动机
/** * 发动机【抽象产品】 */ public abstract class Motor { /** * 发动机信息 */ public abstract void motorInfo(); }
轮胎
/** * 轮胎【抽象产品】 */ public abstract class Tyre { /** * 轮胎信息 */ public abstract void tyreInfo(); }
具体产品
奥迪发动机
/** * 奥迪发动机【具体产品】 */ public class AudiMotor extends Motor { @Override public void motorInfo() { System.out.println("=====奥迪发动机====="); System.out.println("加速:⭐⭐⭐"); System.out.println("极速:⭐⭐⭐⭐"); } }
奔驰发动机
/** * 奔驰发动机【具体产品】 */ public class BenzMotor extends Motor { @Override public void motorInfo() { System.out.println("=====奔驰发动机====="); System.out.println("加速:⭐⭐⭐⭐"); System.out.println("极速:⭐⭐⭐"); } }
宝马发动机
/** * 宝马发动机【具体产品】 */ public class BmwMotor extends Motor { @Override public void motorInfo() { System.out.println("=====宝马发动机====="); System.out.println("加速:⭐⭐⭐⭐⭐"); System.out.println("极速:⭐⭐⭐⭐"); } }
固特异轮胎
/** * 固特异轮胎【具体产品】 */ public class GTYTyre extends Tyre { @Override public void tyreInfo() { System.out.println("=====固特异轮胎====="); System.out.println("耐用指数:⭐⭐⭐⭐"); System.out.println("抓地力:⭐⭐⭐"); } }
米其林轮胎
/** * 米其林轮胎【具体产品】 */ public class MQLTyre extends Tyre { @Override public void tyreInfo() { System.out.println("=====米其林轮胎====="); System.out.println("耐用指数:⭐⭐⭐⭐⭐"); System.out.println("抓地力:⭐⭐⭐⭐"); } }
客户下单
/** * 抽象工厂模式测试类【模拟下单】 */ public class AbstractFactoryTest { public static void main(String[] args) throws Exception { /*需求:客户要买一辆宝马车*/ //1、获取宝马工厂 CarAbstractFactory carFactory = new BmwFactory(); //2、组装发动机 carFactory.packageMotor(); //3、组装轮胎 carFactory.packageTyre(); //4、输出车车配置信息 ((BmwFactory) carFactory).carInfo(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律