设计模式-工厂方法模式 Java

模式概述

工厂方法模式(Factory Method Pattern)又称为工厂模式,定义创建对象的接口,但将具体实现延迟到子类,实现对象创建与使用的解耦。

简单代码示例

// 1. 抽象产品:日志记录器接口
interface Logger {
    void log(String message);
}

// 2. 具体产品:文件日志记录器
class FileLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("【文件日志】" + message);
    }
}

// 3. 具体产品:控制台日志记录器
class ConsoleLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("【控制台日志】" + message);
    }
}

// 4. 抽象工厂:定义工厂方法
abstract class LoggerFactory {
    // 核心工厂方法(可包含默认实现)
    public abstract Logger createLogger();
    
    // 扩展方法(非必需)
    public void writeLog(String message) {
        Logger logger = createLogger();
        logger.log(message);
    }
}

// 5. 具体工厂:创建文件日志器
class FileLoggerFactory extends LoggerFactory {
    @Override
    public Logger createLogger() {
        return new FileLogger(); // 返回具体产品
    }
}

// 6. 具体工厂:创建控制台日志器
class ConsoleLoggerFactory extends LoggerFactory {
    @Override
    public Logger createLogger() {
        return new ConsoleLogger(); // 返回具体产品
    }
}

// 7. 客户端调用
public class Client {
    public static void main(String[] args) {
        // 使用文件日志工厂
        LoggerFactory fileFactory = new FileLoggerFactory();
        fileFactory.writeLog("用户登录成功");
        
        // 使用控制台日志工厂
        LoggerFactory consoleFactory = new ConsoleLoggerFactory();
        consoleFactory.writeLog("数据校验通过");
    }
}

运行结果:

【文件日志】用户登录成功
【控制台日志】数据校验通过

技术细节

1.模式组成

组件 职责说明
抽象产品 定义产品的公共接口
具体产品 实现抽象产品的具体类
抽象工厂 声明工厂公共方法
具体工厂 实现工厂方法,返回具体产品

2.优点与缺点

优点:

  • 解耦:客户端无需感知具体产品类名
  • 扩展性:新增产品只需添加工厂子类(符合开闭原则)
  • 可维护性:创建逻辑集中管理,避免代码重复
  • 多态性:支持运行时动态切换产品类型

缺点:

  • 类数量膨胀:每增加一个产品类型,需同步增加具体工厂类,导致类数量翻倍增长
  • 复杂度提升:实现时可能需要用到DOM、反射等技术,增加了系统的实现难度
  • 代码冗余:简单创建逻辑时显得过度设计(如只有1-2种固定产品)

你可能感兴趣的:(设计模式-工厂方法模式 Java)