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

相关推荐
IT枫斗者6 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
AI自动化工坊9 小时前
Late框架技术深度解析:5GB VRAM实现10倍AI编码效率的工程架构
人工智能·5g·架构·ai编程·late
空中海9 小时前
第六篇:架构篇 — 微服务、部署、高并发与专家级能力
微服务·云原生·架构
Wave84510 小时前
基于 STM32 + ESP8266 + W25Q64 的双核 OTA 底层架构总结
stm32·嵌入式硬件·架构
yongyoudayee11 小时前
CRM架构演进:从记录系统到执行引擎的技术解析
架构
源码宝11 小时前
基于 SpringBoot + Vue 的医院随访系统:技术架构与功能实现
java·vue.js·spring boot·架构·源码·随访系统·随访管理
有马贵将12 小时前
【5】微前端知识点总结
前端·架构
ting945200012 小时前
深入解析 Social Fetch 机制:原理、架构、应用场景、实战落地与性能优化全攻略
人工智能·性能优化·架构
ZOOOOOOU12 小时前
云边端协同架构下,门禁权限引擎的离线决策与策略续存实现
大数据·人工智能·架构
heimeiyingwang13 小时前
【架构实战】编排vs协同:微服务通信架构选型
微服务·云原生·架构