1. 什么是工厂方法模式
工厂方法模式(Factory Method)是 GoF 23种设计模式中创建型设计模式 之一,其核心思想是 把"实例化哪一个类"这件事推迟到子类去执行 ,从而让"产品"的创建与使用解耦。总结为一句话:我不new对象,我让子类new。
2. 角色与UML
classDiagram
direction BT
class Log {
<>
+write(String message)
}
class FileLog {
+write(String message)
}
class ConsoleLog {
+write(String message)
}
class LogFactory {
<>
+createLog() Log
+logError(String err)
}
class FileLogFactory {
+createLog() Log
}
class ConsoleLogFactory {
+createLog() Log
}
class Client
Log <|.. FileLog : implements
Log <|.. ConsoleLog : implements
LogFactory <|-- FileLogFactory : extends
LogFactory <|-- ConsoleLogFactory : extends
LogFactory ..> Log : creates / uses
Client ..> LogFactory : uses
- Log:产品接口(或抽象类)。
- FileLog/ConsoleLog:具体产品。
- LogFactory:声明创建产品的方法(父类)。
- FileLogFactory/ConsoleLogFactory:实现父类声明的方法,真正创建对象。
- Client:只持有 Log 和 LogFactory 的引用,不依赖任何具体类。
3. Java代码示例
- 产品层
java
public interface Log {
void write(String message);
}
public class FileLog implements Log {
public void write(String message) {
System.out.println("File::" + message);
}
}
public class ConsoleLog implements Log {
public void write(String message) {
System.out.println("Console::" + message);
}
}
- 创建者层
java
public abstract class LogFactory {
// 这就是"工厂方法"
public abstract Log createLog();
// 模板业务,可复用
public void logError(String err) {
// 多态点
Log log = createLog();
log.write("[ERROR] " + err);
}
}
public class FileLogFactory extends LogFactory {
public Log createLog() {
// 真正 new 的地方
return new FileLog();
}
}
public class ConsoleLogFactory extends LogFactory {
public Log createLog() {
return new ConsoleLog();
}
}
- 客户端
java
public class Client {
public static void main(String[] args) {
LogFactory factory = new FileLogFactory(); // 可配置
factory.logError("磁盘满了");
}
}
运行结果
arduino
File::[ERROR] 磁盘满了
4. 优点
- 解耦:客户端无需知道具体产品类名
- 开闭:新增产品只需新增 XXLogFactory,不用更改旧代码。
- 并行层级:创建者与产品各成体系,一一对应(如FileLogFactory对应FileLog、ConsoleLogFactory对应ConsoleLog)。
5. 使用场景
- 类不知道自己要创建的对象确切类型
- 类希望子类来指定创建对象
一句话总结:工厂方法 = 把 new 的动作交给"工厂子类"去做,让系统对扩展开放,对修改关闭。