设计模式-抽象工厂模式

定义理解

抽象工厂模式是一种为访问一系列相互关联的产品对象提供统一接口,而无需指定它们具体的类。抽象工厂模式可以创建多个不同类型的产品,这些产品构成一个产品族。

简单来说,当抽象工厂模式如果只有一个产品体系的话就会退化为工厂方法模式

特点:

  • 产品族:一系列相互关联或相互依赖的产品对象。
  • 多个抽象产品:每个抽象产品都可以有多个具体实现。
  • 接口数量:理论上可以有无限个接口,每个接口对应一个产品族。
  • 开闭原则:在新增产品族时符合"开闭原则",但在新增单一产品时可能不符合。

图解

代码示例

java 复制代码
// 抽象产品:日志接口  
interface Logger {  
    void log(String message);  
}  
  
// 具体产品:Log4j 日志实现  
class Log4jLogger implements Logger {  
    @Override  
    public void log(String message) {  
        System.out.println("Log4j: " + message);  
    }  
}  
  
// 具体产品:Logback 日志实现  
class LogbackLogger implements Logger {  
    @Override  
    public void log(String message) {  
        System.out.println("Logback: " + message);  
    }  
}  
  
// 抽象产品:不同日志级别的接口  
interface LogLevel {  
    void log(Logger logger, String message);  
}  
  
// 具体产品:DEBUG 日志级别实现  
class DebugLogLevel implements LogLevel {  
    @Override  
    public void log(Logger logger, String message) {  
        logger.log("[DEBUG] " + message);  
    }  
}  
  
// 具体产品:ERROR 日志级别实现  
class ErrorLogLevel implements LogLevel {  
    @Override  
    public void log(Logger logger, String message) {  
        logger.log("[ERROR] " + message);  
    }  
}  
  
// 抽象工厂:日志工厂接口  
interface LoggerFactory {  
    Logger getLogger();  
    LogLevel getLogLevel(String level);  
}  
  
// 具体工厂:Log4j 日志工厂实现  
class Log4jLoggerFactory implements LoggerFactory {  
    @Override  
    public Logger getLogger() {  
        return new Log4jLogger();  
    }  
  
    @Override  
    public LogLevel getLogLevel(String level) {  
        if ("DEBUG".equalsIgnoreCase(level)) {  
            return new DebugLogLevel();  
        } else if ("ERROR".equalsIgnoreCase(level)) {  
            return new ErrorLogLevel();  
        }  
        // 其他情况可以抛出异常或返回默认实现  
        return null;  
    }  
}  
  
// 客户端代码  
public class Client {  
    public static void main(String[] args) {  
        // 使用 Log4j 日志工厂创建日志实例和日志级别实例  
        LoggerFactory log4jFactory = new Log4jLoggerFactory();  
        Logger log4jLogger = log4jFactory.getLogger();  
        LogLevel debugLevel = log4jFactory.getLogLevel("DEBUG");  
        LogLevel errorLevel = log4jFactory.getLogLevel("ERROR");  
  
        debugLevel.log(log4jLogger, "This is a Log4j DEBUG log message.");  
        errorLevel.log(log4jLogger, "This is a Log4j ERROR log message.");  
    }  
}

与其他模式的对比

  1. 抽象工厂模式 vs 简单工厂模式
  • 定义变量:简单工厂模式使用参数或配置文件等定义好的变量;抽象工厂模式每次新增产品都需要修改类方法。
  • 接口数量:简单工厂模式只有一个接口;抽象工厂模式可以有多个接口。
  • 扩展性:简单工厂模式系统扩展困难,添加新产品需要修改工厂逻辑;抽象工厂模式则更适合创建产品族。
  1. 抽象工厂模式 vs 工厂方法模式
  • 产品范围:工厂方法模式针对一个抽象产品类进行创建;抽象工厂模式则针对多个抽象产品类创建。
  • 工厂数量:工厂方法模式的具体工厂类只能创建一个具体产品类的实例;抽象工厂模式的具体工厂类可以创建多个具体产品类的实例。
  • 适用场景:工厂方法模式适用于需要扩展产品类型但不关心产品族之间关系的场景;抽象工厂模式适用于需要创建多个产品族且产品族之间有相互关联的场景。
相关推荐
好学且牛逼的马5 分钟前
MyBatis-Plus的深度解析
java
苏纪云6 分钟前
数据结构<C++>——数组
java·数据结构·c++·数组·动态数组
典则28 分钟前
STM32FreeRtos入门(五)——同步互斥与通信
java·jvm·stm32
你不是我我28 分钟前
【Java 开发日记】我们来讲一讲阻塞队列及其应用
java·开发语言
互联网中的一颗神经元30 分钟前
小白python入门 - 9. Python 列表2 ——从基础操作到高级应用
java·开发语言·python
大厂码农老A34 分钟前
我带的外包兄弟放弃大厂转正,薪资翻倍入职字节
java·后端·面试
摇滚侠42 分钟前
Spring Boot3零基础教程,生命周期监听,自定义监听器,笔记59
java·开发语言·spring boot·笔记
凯子坚持 c1 小时前
Llama-2-7b在昇腾NPU上的六大核心场景性能基准报告
java·开发语言·llama
百锦再1 小时前
国产数据库替代MongoDB的技术实践:金仓数据库赋能浙江省人民医院信息化建设新展望
java·开发语言·数据库·mongodb·架构·eclipse·maven
武子康1 小时前
Java-160 MongoDB副本集部署实战 单机三实例/多机同法 10 分钟起集群 + 选举/读写/回滚全流程
java·数据库·sql·mongodb·性能优化·系统架构·nosql