恙髡 发表于 2025-6-26 14:32:59

【设计模式】工厂模式

工厂方法模式深度解析:对象创建的优雅之道

一、工厂方法模式核心概念

工厂方法模式(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);四、工厂方法模式原理深度剖析


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【设计模式】工厂模式