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 的动作交给"工厂子类"去做,让系统对扩展开放,对修改关闭。

相关推荐
sunny_4 小时前
⚡️ vite-plugin-oxc:从 Babel 到 Oxc,我为 Vite 写了一个高性能编译插件
前端·webpack·架构
兆子龙8 小时前
模块联邦(Module Federation)详解:从概念到手把手 Demo
前端·架构
Bigger10 小时前
告别版本焦虑:如何为 Hugo 项目定制专属构建环境
前端·架构·go
狗哥哥14 小时前
微前端架构下的平台级公共组件资源体系设计
前端·架构
两万五千个小时14 小时前
落地实现 Anthropic Multi-Agent Research System
人工智能·python·架构
Mintopia15 小时前
思想长期停在事物表面的深层原因:认知机制、环境结构与技术化治理
架构
兆子龙15 小时前
React Compiler 来了:少写 useMemo,照样稳
前端·架构
兆子龙1 天前
用 React + Remotion 做视频:入门与 AI 驱动生成
前端·架构
一枚前端小姐姐1 天前
低代码平台表单设计系统技术分析(实战二)
低代码·架构·前端框架
爱勇宝1 天前
2026年前端生存规划:只会写页面的人,正在被悄悄淘汰
前端·后端·架构