工厂方法模式(Factory Method Pattern)
工厂方法模式是一种 创建型设计模式,它定义了一个创建对象的接口,但让子类决定实例化哪一个具体类。通过这种方式,工厂方法将对象的创建延迟到子类,避免了直接依赖具体类。
原理
- 核心思想:将对象的实例化交给工厂子类处理,使得客户端代码只依赖于抽象工厂,而不依赖具体实现。
- 参与角色 :
- 抽象工厂(Creator):定义工厂方法,通常是一个抽象类或接口。
- 具体工厂(Concrete Creator):实现工厂方法,负责实例化具体的产品。
- 抽象产品(Product):定义产品的接口。
- 具体产品(Concrete Product):实现具体的产品接口。
优点
- 灵活性:客户端代码通过工厂接口创建对象,避免直接依赖具体类,方便扩展。
- 单一职责原则:将对象创建的代码集中到工厂中,减少了重复代码。
- 开闭原则:增加新的产品类时,只需增加新的工厂类,原有代码无需修改。
缺点
- 增加复杂性:每新增一个产品类都需要对应的工厂类。
- 不适合过多产品的场景:可能会导致大量工厂类的出现。
示例代码
以创建不同类型的日志记录器(文件日志、数据库日志)为例:
1. 定义抽象产品和具体产品
java
// 抽象产品
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. 定义抽象工厂和具体工厂
java
// 抽象工厂
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. 客户端代码
客户端通过抽象工厂创建具体产品,而不需要关心具体产品的实现。
java
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.");
}
}
输出结果
text
File Logger: Logging to a file.
Database Logger: Logging to a database.
小结
-
适用场景:
- 客户端需要创建某些对象,但无法预知具体类型时。
- 系统中有多个产品类,并且这些产品类可能会不断增加。
-
扩展性:
- 增加新产品类时,只需新增对应的具体工厂类,原有代码不需要修改。
工厂方法模式是 简单工厂模式 的进一步抽象和扩展,适合于复杂、可扩展性要求高的场景。