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