定义理解
抽象工厂模式是一种为访问一系列相互关联的产品对象提供统一接口,而无需指定它们具体的类。抽象工厂模式可以创建多个不同类型的产品,这些产品构成一个产品族。
简单来说,当抽象工厂模式如果只有一个产品体系的话就会退化为工厂方法模式
特点:
- 产品族:一系列相互关联或相互依赖的产品对象。
- 多个抽象产品:每个抽象产品都可以有多个具体实现。
- 接口数量:理论上可以有无限个接口,每个接口对应一个产品族。
- 开闭原则:在新增产品族时符合“开闭原则”,但在新增单一产品时可能不符合。
图解
代码示例
// 抽象产品:日志接口
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."); }
}
与其他模式的对比
- 抽象工厂模式 vs 简单工厂模式
- 定义变量:简单工厂模式使用参数或配置文件等定义好的变量;抽象工厂模式每次新增产品都需要修改类方法。
- 接口数量:简单工厂模式只有一个接口;抽象工厂模式可以有多个接口。
- 扩展性:简单工厂模式系统扩展困难,添加新产品需要修改工厂逻辑;抽象工厂模式则更适合创建产品族。
- 抽象工厂模式 vs 工厂方法模式
- 产品范围:工厂方法模式针对一个抽象产品类进行创建;抽象工厂模式则针对多个抽象产品类创建。
- 工厂数量:工厂方法模式的具体工厂类只能创建一个具体产品类的实例;抽象工厂模式的具体工厂类可以创建多个具体产品类的实例。
- 适用场景:工厂方法模式适用于需要扩展产品类型但不关心产品族之间关系的场景;抽象工厂模式适用于需要创建多个产品族且产品族之间有相互关联的场景。