设计模式-抽象工厂模式
抽象工厂可以在工厂方法模式上来理解
首先,简单工厂模式内部的if或者case语句是不满足开放-封闭原则的
所以对简单工厂模式进一步优化,出现了工厂方法模式。
工厂方法模式将工厂抽象,实例化出不同的工厂,使得满足了开放-封闭原则
抽象工厂是在工厂方法模式上的又一部增强
工厂方法模式解决了同一类型物品实例化的问题,而抽象工厂解决了不同类型物品实例化的问题
按照工厂方法卖车的例子来说 client在需要汽车时,根据需要的型号找到对应的工厂来获取汽车。
不同类型的汽车都属于汽车类型。
此时如果又需要轮船了怎么办?
这时抽象工厂就出现了,相当于每个工厂既能生产汽车,又能生成轮船

那么之前工厂方法模式的例子中的工厂抽象类就要增加生成轮船的方法
//定义工厂抽象类 abstract class Factory{ //能生产汽车 public abstract Car getCar(); //也能生产轮船 public abstract Car getShip(); }
增加轮船的抽象类
//定义轮船的抽象类 abstract class Ship{ public abstract void getType(); }
定义三种轮船
//定义三种轮船 class ShipA extends Ship{ @Override public void getType() { System.out.println("A型号轮船"); } } class ShipB extends Ship{ @Override public void getType() { System.out.println("B型号轮船"); } } class ShipC extends Ship{ @Override public void getType() { System.out.println("C型号轮船"); } }
三种工厂还要增加获取轮船的方法
//定义三种工厂 class FactoryA extends Factory{ @Override public Car getCar() { return new CarA(); } @Override public Car getShip() { return new ShipA(); } } class FactoryB extends Factory{ @Override public Car getCar() { return new CarB(); } @Override public Car getShip() { return new ShipB(); } } class FactoryC extends Factory{ @Override public Car getCar() { return new CarC(); } @Override public Car getShip() { return new ShipC(); } }
测试
public class AbstractFactoryTest { public static void main(String[] args) { //需要汽车 Factory factoryB = new FactoryB(); Car car = factoryB.getCar(); car.getType(); //需要轮船 Factory factoryC = new FactoryC(); Ship ship = factoryC.getShip(); ship.getType(); } }
在之前只需要生产汽车的时候,工厂方法模式就很好的解决了问题,
之后增加了需求,也需要轮船了,那么此时工厂既能生产汽车,也能生产轮船
就升级为抽象工厂模式,解决了不同族类型的问题

汽车是一个族,轮船是一个族,汽车和轮船不是同一个族

工厂方法解决了同族商品不同型号的问题
抽象工厂解决了不同族商品不同型号的问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端