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

相关推荐
破烂pan17 小时前
2025年下半年AI应用架构演进:从RAG到Agent再到MCP的生态跃迁
人工智能·架构·ai应用
Xの哲學18 小时前
Linux NAT 深度剖析: 从设计哲学到实现细节
linux·服务器·网络·架构·边缘计算
Allen正心正念202518 小时前
AWS专家Greg Coquillo提出的8层Agentic AI架构分析
人工智能·架构·aws
神算大模型APi--天枢64618 小时前
全栈自主可控:国产算力平台重塑大模型后端开发与部署生态
大数据·前端·人工智能·架构·硬件架构
Tadas-Gao18 小时前
存储技术革命:SSD、PCIe与NVMe的创新架构设计与性能优化
java·性能优化·架构·系统架构·存储
想用offer打牌19 小时前
一站式了解跨域问题
网络协议·面试·架构
古城小栈19 小时前
雾计算架构:边缘-云端协同的分布式 AI 推理
人工智能·分布式·架构
Allen正心正念202519 小时前
AWS专家Greg Coquillo提出的 6种LLM ORCHESTRATION PATTERNS解析
人工智能·架构
Selegant19 小时前
告别传统部署:用 GraalVM Native Image 构建秒级启动的 Java 微服务
java·开发语言·微服务·云原生·架构
动亦定19 小时前
微服务中如何保证数据一致性?
java·数据库·微服务·架构