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("日志记录开始!");
    }
}

🆚 与简单工厂的区别

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

🧩 优点

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

⚠️ 缺点

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

✅ 使用建议

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

相关推荐
学到头秃的suhian2 小时前
Maven
java·maven
小坏讲微服务2 小时前
Docker-compose 搭建Maven私服部署
java·spring boot·后端·docker·微服务·容器·maven
chxii2 小时前
Maven 详解(下)
java·maven
inferno2 小时前
Maven基础(二)
java·开发语言·maven
杨武博2 小时前
关于maven中pom依赖冲突问题记录
java·maven
陈果然DeepVersion3 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(十)
java·spring boot·ai·kafka·面试题·向量数据库·rag
但要及时清醒4 小时前
ArrayList和LinkedList
java·开发语言
一叶飘零_sweeeet4 小时前
从测试小白到高手:JUnit 5 核心注解 @BeforeEach 与 @AfterEach 的实战指南
java·junit
摇滚侠4 小时前
Spring Boot3零基础教程,Reactive-Stream 四大核心组件,笔记106
java·spring boot·笔记