模式概述
工厂方法模式(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种固定产品)