四.抽象工厂模式
一.抽象工厂模式的定义
提供一个接口用于创建相关或依赖对象的家族,而无需指定具体类。客户端通过抽象接口获取对象,与具体实现解耦。
- 强调产品族一致性
- 与工厂方法模式区别:抽象工厂生产多类产品,工厂方法生产单类产品
二.核心结构
角色 | 职责 |
---|---|
抽象工厂 | 声明创建产品族的方法 |
具体工厂 | 实现接口,生成特定产品族对象 |
抽象产品 | 定义产品接口 |
具体产品 | 实现产品接口 |
三.案例
通俗来讲,抽象工厂模式是多个工厂方法模式组合起来,是它的升级版。它定义了一个工厂接口或抽象类,这个工厂可以创建一组相关或依赖对象的家族(比如;发动机、轮胎等等组合起来才是一辆汽车),每个具体工厂实现这个接口时,都会为这一组产品提供各自的实现。这组产品中的每一个对象,都可以看作是一个独立的“工厂方法模式”的产物。
工厂方法模式适用于单一产品的创建,抽象工厂模式适用于一组相关产品的创建。
// 抽象产品:发动机
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中设计模式干货,第一时间推送给你!
🔔 有什么问题也可以在评论区讨论🤝🤝🤝