23种设计模式-创建型模式之工厂方法模式(Java版本)

Java 工厂方法模式(Factory Method Pattern)详解

🌟 什么是工厂方法模式?

工厂方法模式是一种创建型设计模式,定义一个创建对象的接口,让子类决定实例化哪一个类

它让类的实例化推迟到子类进行,实现了代码解耦与可扩展性增强


🧠 使用场景

  • 不知道对象的具体类型时
  • 需要将对象的创建与使用解耦
  • 代码需要遵循开闭原则,便于扩展新产品

🏗️ 模式结构

  • Product(抽象产品类)
  • ConcreteProduct(具体产品类)
  • Factory(抽象工厂类)
  • ConcreteFactory(具体工厂类)

✅ 示例:创建不同类型的日志类

抽象产品接口

java 复制代码
public interface Logger {
    void log(String message);
}

具体产品实现

java 复制代码
public class FileLogger implements Logger {
    public void log(String message) {
        System.out.println("File log: " + message);
    }
}

public class ConsoleLogger implements Logger {
    public void log(String message) {
        System.out.println("Console log: " + message);
    }
}

抽象工厂

java 复制代码
public interface LoggerFactory {
    Logger createLogger();
}

具体工厂类

java 复制代码
public class FileLoggerFactory implements LoggerFactory {
    public Logger createLogger() {
        return new FileLogger();
    }
}

public class ConsoleLoggerFactory implements LoggerFactory {
    public Logger createLogger() {
        return new ConsoleLogger();
    }
}

客户端调用

java 复制代码
public class Client {
    public static void main(String[] args) {
        LoggerFactory factory = new FileLoggerFactory(); // 可替换为 ConsoleLoggerFactory
        Logger logger = factory.createLogger();
        logger.log("日志记录开始!");
    }
}

🆚 与简单工厂的区别

简单工厂 工厂方法模式
由一个工厂类创建所有产品 每个产品对应一个具体工厂类
不符合开闭原则 符合开闭原则
添加新产品需要改工厂类 添加新产品只需新增工厂子类

🧩 优点

  • 符合开闭原则,增加新产品不用修改已有代码
  • 封装具体产品的创建逻辑,降低耦合
  • 更灵活,易于扩展

⚠️ 缺点

  • 类的数量增加,每新增一个产品就需要增加一个工厂类
  • 增加系统复杂度

✅ 使用建议

当你需要将对象创建过程从客户端中抽离出来,且可能会新增新类型产品时,使用工厂方法模式是最佳选择

相关推荐
Mr.Ja4 分钟前
【LeetCode热题100】No.1——两数之和(Java)
java·算法·leetcode
编啊编程啊程12 分钟前
gRPC从0到1系列【20】
java·rpc·kafka·dubbo·nio
青草地溪水旁28 分钟前
第五章:原型模式 - 克隆大法的大师
c++·设计模式·原型模式
万邦科技Lafite2 小时前
如何对接API接口?需要用到哪些软件工具?
java·前端·python·api·开放api·电商开放平台
1710orange2 小时前
java设计模式:静态代理模式
java·设计模式·代理模式
我真的是大笨蛋3 小时前
开闭原则详解(OCP)
java·设计模式·性能优化·开闭原则·设计规范
编啊编程啊程3 小时前
gRPC从0到1系列【19】
java·spring boot·rpc·dubbo·nio
泥嚎泥嚎3 小时前
【Android】Android 的三种动画(帧动画、View 动画、属性动画)
java
不良人天码星3 小时前
使用Java连接redis以及开放redis端口的问题
java·开发语言·redis
马克学长3 小时前
SSM村务管理系统s2qnw(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·服务器·数据库