23种设计模式之工厂方法模式

1. 什么是工厂方法模式

工厂方法模式(Factory Method)是 GoF 23种设计模式中创建型设计模式 之一,其核心思想是 把"实例化哪一个类"这件事推迟到子类去执行 ,从而让"产品"的创建与使用解耦。总结为一句话:我不new对象,我让子类new。

2. 角色与UML

classDiagram direction BT class Log { <> +write(String message) } class FileLog { +write(String message) } class ConsoleLog { +write(String message) } class LogFactory { <> +createLog() Log +logError(String err) } class FileLogFactory { +createLog() Log } class ConsoleLogFactory { +createLog() Log } class Client Log <|.. FileLog : implements Log <|.. ConsoleLog : implements LogFactory <|-- FileLogFactory : extends LogFactory <|-- ConsoleLogFactory : extends LogFactory ..> Log : creates / uses Client ..> LogFactory : uses
  • Log:产品接口(或抽象类)。
  • FileLog/ConsoleLog:具体产品。
  • LogFactory:声明创建产品的方法(父类)。
  • FileLogFactory/ConsoleLogFactory:实现父类声明的方法,真正创建对象。
  • Client:只持有 Log 和 LogFactory 的引用,不依赖任何具体类。

3. Java代码示例

  • 产品层
java 复制代码
public interface Log {
    void write(String message);
}

public class FileLog implements Log {
    public void write(String message) {
        System.out.println("File::" + message);
    }
}

public class ConsoleLog implements Log {
    public void write(String message) {
        System.out.println("Console::" + message);
    }
}
  • 创建者层
java 复制代码
public abstract class LogFactory {
    // 这就是"工厂方法"
    public abstract Log createLog();

    // 模板业务,可复用
    public void logError(String err) {
        // 多态点
        Log log = createLog();
        log.write("[ERROR] " + err);
    }
}

public class FileLogFactory extends LogFactory {
    public Log createLog() {
        // 真正 new 的地方
        return new FileLog();
    }
}

public class ConsoleLogFactory extends LogFactory {
    public Log createLog() {
        return new ConsoleLog();
    }
}
  • 客户端
java 复制代码
public class Client {
    public static void main(String[] args) {
        LogFactory factory = new FileLogFactory(); // 可配置
        factory.logError("磁盘满了");
    }
}

运行结果

arduino 复制代码
File::[ERROR] 磁盘满了

4. 优点

  • 解耦:客户端无需知道具体产品类名
  • 开闭:新增产品只需新增 XXLogFactory,不用更改旧代码。
  • 并行层级:创建者与产品各成体系,一一对应(如FileLogFactory对应FileLog、ConsoleLogFactory对应ConsoleLog)。

5. 使用场景

  • 类不知道自己要创建的对象确切类型
  • 类希望子类来指定创建对象

一句话总结:工厂方法 = 把 new 的动作交给"工厂子类"去做,让系统对扩展开放,对修改关闭。

相关推荐
鹏北海43 分钟前
多标签页登录状态同步:一个简单而有效的解决方案
前端·面试·架构
Xの哲學1 小时前
Linux 分区表深度技术剖析
linux·网络·算法·架构·边缘计算
TracyCoder1232 小时前
微服务概念理解学习笔记
学习·微服务·架构
小璞2 小时前
六、React 并发模式:让应用"感觉"更快的架构智慧
前端·react.js·架构
ALex_zry3 小时前
高并发系统渐进式改造技术调研报告:策略、架构与实战
java·运维·架构
木易 士心3 小时前
WebSocket 与 MQTT 在即时通讯中的深度对比与架构选型指南
websocket·网络协议·架构
Tadas-Gao3 小时前
Spring Boot 4.0架构革新:构建更精简、更安全、更高效的Java应用
java·spring boot·分布式·微服务·云原生·架构·系统架构
BG8EQB4 小时前
开发者的存储救赎计划:从SQL到云原生的架构演进
sql·云原生·架构
Leinwin4 小时前
微软发布全新一代 Arm 架构云原生处理器 Cobalt 200
arm开发·microsoft·架构
勇气要爆发4 小时前
【第五阶段-高级特性和架构】第三章:高级状态管理—GetX状态管理篇
android·架构