找回密码
 立即注册
首页 业界区 安全 【设计模式】工厂模式

【设计模式】工厂模式

恙髡 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. 基础实现(标准模式)
  1. // 产品接口
  2. interface Transport {
  3.     void deliver();
  4. }
  5. // 具体产品
  6. class Truck implements Transport {
  7.     @Override
  8.     public void deliver() {
  9.         System.out.println("陆路运输:卡车送货");
  10.     }
  11. }
  12. class Ship implements Transport {
  13.     @Override
  14.     public void deliver() {
  15.         System.out.println("海运:货轮送货");
  16.     }
  17. }
  18. // 创建者接口
  19. interface Logistics {
  20.     Transport createTransport();
  21. }
  22. // 具体创建者
  23. class RoadLogistics implements Logistics {
  24.     @Override
  25.     public Transport createTransport() {
  26.         return new Truck();
  27.     }
  28. }
  29. class SeaLogistics implements Logistics {
  30.     @Override
  31.     public Transport createTransport() {
  32.         return new Ship();
  33.     }
  34. }
  35. // 客户端使用
  36. public class Client {
  37.     public static void main(String[] args) {
  38.         Logistics logistics = new RoadLogistics();
  39.         Transport transport = logistics.createTransport();
  40.         transport.deliver(); // 输出:陆路运输:卡车送货
  41.     }
  42. }
复制代码
2. 参数化工厂方法
  1. enum TransportType { TRUCK, SHIP, AIRPLANE }
  2. abstract class Logistics {
  3.     // 参数化工厂方法
  4.     public Transport createTransport(TransportType type) {
  5.         switch (type) {
  6.             case TRUCK: return new Truck();
  7.             case SHIP: return new Ship();
  8.             case AIRPLANE: return new Airplane();
  9.             default: throw new IllegalArgumentException("未知运输类型");
  10.         }
  11.     }
  12.    
  13.     // 业务方法
  14.     public void planDelivery() {
  15.         Transport t = createTransport(getTransportType());
  16.         t.deliver();
  17.     }
  18.    
  19.     // 抽象方法由子类实现
  20.     protected abstract TransportType getTransportType();
  21. }
  22. // 具体创建者
  23. class FastLogistics extends Logistics {
  24.     @Override
  25.     protected TransportType getTransportType() {
  26.         return TransportType.AIRPLANE;
  27.     }
  28. }
复制代码
3. 使用Lambda表达式(Java 8+)
  1. interface TransportFactory {
  2.     Transport create();
  3. }
  4. public class LambdaFactory {
  5.     public static void main(String[] args) {
  6.         // 使用Lambda实现工厂
  7.         TransportFactory truckFactory = Truck::new;
  8.         TransportFactory shipFactory = Ship::new;
  9.         
  10.         Transport t1 = truckFactory.create();
  11.         Transport t2 = shipFactory.create();
  12.         
  13.         t1.deliver(); // 输出:陆路运输:卡车送货
  14.         t2.deliver(); // 输出:海运:货轮送货
  15.     }
  16. }
复制代码
4. 带初始化参数的工厂
  1. interface TransportFactory {
  2.     Transport create(String model, double capacity);
  3. }
  4. class TruckFactory implements TransportFactory {
  5.     @Override
  6.     public Transport create(String model, double capacity) {
  7.         Truck truck = new Truck();
  8.         truck.setModel(model);
  9.         truck.setCapacity(capacity);
  10.         return truck;
  11.     }
  12. }
  13. // 客户端使用
  14. Transport heavyTruck = new TruckFactory()
  15.     .create("Heavy-Duty", 20.0);
复制代码
四、工厂方法模式原理深度剖析


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册