工厂方法模式深度解析:对象创建的优雅之道
一、工厂方法模式核心概念
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,定义了一个创建对象的接口,但让子类决定实例化哪一个类。它将对象的实例化过程推迟到子类,实现了创建者与具体产品的解耦。
核心价值:
- ✅ 解耦创建逻辑:将对象创建代码与使用代码分离
- ✅ 扩展性强:新增产品类型只需添加新工厂
- ✅ 符合开闭原则:不修改已有代码即可扩展系统
- ✅ 统一创建入口:提供一致的实例化接口
二、为什么需要工厂方法模式?
当遇到以下场景时,工厂方法模式是理想选择:
- 创建逻辑复杂:对象创建需要多步初始化或条件判断
- 系统需要扩展:预期未来会新增产品类型
- 依赖抽象而非实现:客户端不应依赖具体类
- 资源统一管理:如数据库连接、线程池等资源的创建
graph LR Client --> Creator[创建者接口] Creator --> ConcreteCreatorA[具体创建者A] Creator --> ConcreteCreatorB[具体创建者B] ConcreteCreatorA --> ProductA[具体产品A] ConcreteCreatorB --> ProductB[具体产品B]三、工厂方法模式实现方式大全
1. 基础实现(标准模式)
- // 产品接口
- interface Transport {
- void deliver();
- }
- // 具体产品
- class Truck implements Transport {
- @Override
- public void deliver() {
- System.out.println("陆路运输:卡车送货");
- }
- }
- class Ship implements Transport {
- @Override
- public void deliver() {
- System.out.println("海运:货轮送货");
- }
- }
- // 创建者接口
- interface Logistics {
- Transport createTransport();
- }
- // 具体创建者
- class RoadLogistics implements Logistics {
- @Override
- public Transport createTransport() {
- return new Truck();
- }
- }
- class SeaLogistics implements Logistics {
- @Override
- public Transport createTransport() {
- return new Ship();
- }
- }
- // 客户端使用
- public class Client {
- public static void main(String[] args) {
- Logistics logistics = new RoadLogistics();
- Transport transport = logistics.createTransport();
- transport.deliver(); // 输出:陆路运输:卡车送货
- }
- }
复制代码 2. 参数化工厂方法
- enum TransportType { TRUCK, SHIP, AIRPLANE }
- abstract class Logistics {
- // 参数化工厂方法
- public Transport createTransport(TransportType type) {
- switch (type) {
- case TRUCK: return new Truck();
- case SHIP: return new Ship();
- case AIRPLANE: return new Airplane();
- default: throw new IllegalArgumentException("未知运输类型");
- }
- }
-
- // 业务方法
- public void planDelivery() {
- Transport t = createTransport(getTransportType());
- t.deliver();
- }
-
- // 抽象方法由子类实现
- protected abstract TransportType getTransportType();
- }
- // 具体创建者
- class FastLogistics extends Logistics {
- @Override
- protected TransportType getTransportType() {
- return TransportType.AIRPLANE;
- }
- }
复制代码 3. 使用Lambda表达式(Java 8+)
- interface TransportFactory {
- Transport create();
- }
- public class LambdaFactory {
- public static void main(String[] args) {
- // 使用Lambda实现工厂
- TransportFactory truckFactory = Truck::new;
- TransportFactory shipFactory = Ship::new;
-
- Transport t1 = truckFactory.create();
- Transport t2 = shipFactory.create();
-
- t1.deliver(); // 输出:陆路运输:卡车送货
- t2.deliver(); // 输出:海运:货轮送货
- }
- }
复制代码 4. 带初始化参数的工厂
- interface TransportFactory {
- Transport create(String model, double capacity);
- }
- class TruckFactory implements TransportFactory {
- @Override
- public Transport create(String model, double capacity) {
- Truck truck = new Truck();
- truck.setModel(model);
- truck.setCapacity(capacity);
- return truck;
- }
- }
- // 客户端使用
- Transport heavyTruck = new TruckFactory()
- .create("Heavy-Duty", 20.0);
复制代码 四、工厂方法模式原理深度剖析
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |