设计模式之工厂方法模式

发布于:2025-06-29 ⋅ 阅读:(17) ⋅ 点赞:(0)

定义

定义了一个创建对象的接口,但由子类决定要实例化的类是哪个。工厂方法让类把实例化推迟到子类。

结构

在这里插入图片描述

简单工厂与工厂方法的对比说明

1)扩展机制
简单工厂模式在新增产品类型时,需修改工厂类的逻辑(如增加 switch/if 分支),‌违反开闭原则‌。
工厂方法模式通过新增具体工厂子类实现新产品的创建(如新增 FactoryB,完成新产品 ProductC和ProductD的创建),‌无需修改原有工厂代码‌,符合开闭原则。

2)职责分配
简单工厂模式下,单一工厂类负责‌所有产品的创建逻辑‌,集中管理导致工厂类职责过重。
工厂方法模式下,每个具体工厂子类‌只负责创建一类产品‌,实现创建逻辑的解耦。

适应场景

1)产品类型‌需频繁扩展‌(如日志系统需支持新增文件日志、网络日志等)。
2)需要‌隔离产品创建逻辑‌,避免工厂类过于庞大

使用示例

这里以日志输出为例,给出工厂方法模式的简单应用。

定义日志接口

/**
 * 定义抽象产品
 */
public interface Logger {

    void info(String message);

    void debug(String message);

    void error(String message);

    void warn(String message);

}

定义具体产品1

public class FileLogger implements Logger {

    @Override
    public void warn(String message) {
        System.out.println("文件 warn级别日志:" + message);
    }

    @Override
    public void error(String message) {
        System.out.println("文件 error级别日志:" + message);
    }

    @Override
    public void debug(String message) {
        System.out.println("文件 debug级别日志:" + message);
    }

    @Override
    public void info(String message) {
        System.out.println("文件 info级别日志:" + message);
    }
}

定义具体产品2

public class ConsoleLogger implements Logger {

    @Override
    public void warn(String message) {
        System.out.println("控制台 warn级别日志:" + message);
    }

    @Override
    public void error(String message) {
        System.out.println("控制台 error级别日志:" + message);
    }

    @Override
    public void debug(String message) {
        System.out.println("控制台 debug级别日志:" + message);
    }

    @Override
    public void info(String message) {
        System.out.println("控制台 info级别日志:" + message);
    }

}

定义抽象工厂

public interface LoggerFactory {

    Logger createLogger();

}

定义生产产品1的具体工厂

public class FileLoggerFactory implements LoggerFactory{

    @Override
    public Logger createLogger() {
        return new FileLogger();
    }
}

定义生产产品2的具体工厂

public class ConsoleLoggerFactory implements LoggerFactory{

    @Override
    public Logger createLogger() {
        return new ConsoleLogger();
    }
}

测试

public class Client {

    public static void main(String[] args) {
        Logger log = new FileLoggerFactory().createLogger();
        log.info("This is an info message");

        log = new ConsoleLoggerFactory().createLogger();
        log.error("This is a error message");
    }

}

网站公告

今日签到

点亮在社区的每一天
去签到