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

1. 什么是工厂方法模式

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

2. 角色与UML

classDiagram direction BT class Log { <<interface>> +write(String message) } class FileLog { +write(String message) } class ConsoleLog { +write(String message) } class LogFactory { <<abstract>> +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 的动作交给"工厂子类"去做,让系统对扩展开放,对修改关闭。

相关推荐
redreamSo5 分钟前
团队 AI 资产总烂在本地?先分清哪些该装、哪些只能连
人工智能·架构·开源
小白鼠幻想家16 小时前
Agent 上下文爆炸:200 万退款事故复盘
架构
杉氧20 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
徐小夕21 小时前
jitword 协同文档3.2发布:打造浏览器中最强word编辑器
前端·架构·github
玉宇夕落1 天前
Harness Engineering 核心四层一:记忆模块的简单学习
架构
BothSavage1 天前
OpenHarness源码研究-3-codex配置到输出对话
后端·架构
杉氧2 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
杉氧2 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
Lion092 天前
ReAct 循环:Agent 的思考引擎 — Think → Act → Observe
架构
得物技术2 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构