当前位置: 首页 > article >正文

抽象工厂方法模式

工厂方法模式(Factory Method Pattern)

工厂方法模式是一种 创建型设计模式,它定义了一个创建对象的接口,但让子类决定实例化哪一个具体类。通过这种方式,工厂方法将对象的创建延迟到子类,避免了直接依赖具体类。


原理

  1. 核心思想:将对象的实例化交给工厂子类处理,使得客户端代码只依赖于抽象工厂,而不依赖具体实现。
  2. 参与角色
    • 抽象工厂(Creator):定义工厂方法,通常是一个抽象类或接口。
    • 具体工厂(Concrete Creator):实现工厂方法,负责实例化具体的产品。
    • 抽象产品(Product):定义产品的接口。
    • 具体产品(Concrete Product):实现具体的产品接口。

优点

  1. 灵活性:客户端代码通过工厂接口创建对象,避免直接依赖具体类,方便扩展。
  2. 单一职责原则:将对象创建的代码集中到工厂中,减少了重复代码。
  3. 开闭原则:增加新的产品类时,只需增加新的工厂类,原有代码无需修改。

缺点

  1. 增加复杂性:每新增一个产品类都需要对应的工厂类。
  2. 不适合过多产品的场景:可能会导致大量工厂类的出现。

示例代码

以创建不同类型的日志记录器(文件日志、数据库日志)为例:

1. 定义抽象产品和具体产品
// 抽象产品
public interface Logger {
    void log(String message);
}

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

// 具体产品:数据库日志记录器
public class DatabaseLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("Database Logger: " + message);
    }
}

2. 定义抽象工厂和具体工厂
// 抽象工厂
public abstract class LoggerFactory {
    public abstract Logger createLogger(); // 工厂方法
}

// 具体工厂:文件日志记录器工厂
public class FileLoggerFactory extends LoggerFactory {
    @Override
    public Logger createLogger() {
        return new FileLogger();
    }
}

// 具体工厂:数据库日志记录器工厂
public class DatabaseLoggerFactory extends LoggerFactory {
    @Override
    public Logger createLogger() {
        return new DatabaseLogger();
    }
}

3. 客户端代码

客户端通过抽象工厂创建具体产品,而不需要关心具体产品的实现。

public class FactoryMethodExample {
    public static void main(String[] args) {
        // 使用文件日志记录器工厂
        LoggerFactory fileLoggerFactory = new FileLoggerFactory();
        Logger fileLogger = fileLoggerFactory.createLogger();
        fileLogger.log("Logging to a file.");

        // 使用数据库日志记录器工厂
        LoggerFactory databaseLoggerFactory = new DatabaseLoggerFactory();
        Logger databaseLogger = databaseLoggerFactory.createLogger();
        databaseLogger.log("Logging to a database.");
    }
}

输出结果

File Logger: Logging to a file.
Database Logger: Logging to a database.

小结

  1. 适用场景

    • 客户端需要创建某些对象,但无法预知具体类型时。
    • 系统中有多个产品类,并且这些产品类可能会不断增加。
  2. 扩展性

    • 增加新产品类时,只需新增对应的具体工厂类,原有代码不需要修改。

工厂方法模式是 简单工厂模式 的进一步抽象和扩展,适合于复杂、可扩展性要求高的场景。


http://www.kler.cn/a/402558.html

相关文章:

  • OpenCV、YOLO、VOC、COCO之间的关系和区别
  • Mysql的加锁情况详解
  • 从零开始学习数据库 day0(基础)
  • oracle查看锁阻塞-谁阻塞了谁
  • Go语言中的内存分配与初始化:new与make函数详解
  • 深度学习每周学习总结J6(ResNeXt-50 算法实战与解析 - 猴痘识别)
  • 谈一下开源生态对 AI人工智能大模型的促进作用
  • 微信小程序上传微信官方审核流程(1)
  • 【C++融会贯通】哈希表的使用
  • ROS VRRP软路由双线组网方式
  • 全自动PPT转视频解决方案:PPT + TTS + 自动化处理
  • 深度学习之目标检测的常用标注工具
  • 基于CNN+RNNs(LSTM, GRU)的红点位置检测(pytorch)
  • CentOS:A服务器主动给B服务器推送(上传),B服务器下载A服务器文件(下载)
  • javaScriptBOM
  • jquery还有其应用场景,智慧慢慢地被边缘化,但不会消亡
  • 无尽梦回公测 低配置手机如何玩无尽梦回?手机发烫内存不足玩无尽梦回攻略
  • 前端面试(2024/10/30,10/31,11/6)
  • PFC和LLC市场方案学习笔记
  • 【Linux学习】【Ubuntu入门】1-8 ubuntu下压缩与解压缩
  • 用源码编译虚幻引擎,并打包到安卓平台
  • 云计算实训室建设的必要性
  • 如何使用docker、挂载数据,以及让docker使用宿主机器的GPU环境
  • 用 Python 与 Turtle 创作属于你的“冰墩墩”!
  • Linux 命令之 tar
  • 常见的软件系统部署架构