【工厂方法模式】工厂方法模式是一种常用的创建型设计模式,它定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法将对象的创建过程封装起来,使系统更加灵活和可扩展。
一、概述
工厂方法模式通过引入一个抽象的工厂类,由具体的子类来实现对象的创建。这种模式的核心思想是“将对象的创建与使用分离”,从而提高系统的灵活性和可维护性。
二、结构组成
| 名称 | 说明 |
| Product | 定义产品接口或抽象类,所有具体产品都实现该接口或继承该类。 |
| ConcreteProduct | 具体的产品类,实现Product接口或继承Product类。 |
| Creator | 定义工厂类的接口,包含一个工厂方法(Factory Method),返回Product类型。 |
| ConcreteCreator | 具体的工厂类,实现Creator接口,并重写工厂方法以返回具体的Product实例。 |
三、优点
| 优点 | 说明 |
| 松耦合 | 客户端无需知道具体产品类,只需依赖Product接口或抽象类。 |
| 易于扩展 | 新增产品时,只需添加新的ConcreteProduct和ConcreteCreator类,无需修改原有代码。 |
| 符合开闭原则 | 对扩展开放,对修改关闭。 |
| 提高代码复用性 | 工厂方法可以被多个地方调用,避免重复代码。 |
四、缺点
| 缺点 | 说明 |
| 增加系统复杂度 | 引入更多的类,增加系统复杂性。 |
| 需要额外的类来实现 | 每个产品都需要一个对应的工厂类,可能造成类的数量增加。 |
| 不适合简单场景 | 对于简单的对象创建,使用工厂方法可能显得过于复杂。 |
五、适用场景
| 场景 | 说明 |
| 对象创建逻辑复杂 | 当对象的创建过程比较复杂时,使用工厂方法可以简化客户端代码。 |
| 系统需要动态扩展 | 当系统需要支持多种产品类型,并且未来可能会有新增产品时。 |
| 客户端不需要知道具体类 | 客户端只需要使用统一的接口来获取产品,而不需要关心具体实现。 |
六、示例代码(Java)
```java
// Product 接口
interface Product {
void use();
}
// 具体产品A
class ConcreteProductA implements Product {
public void use() {
System.out.println("使用产品A");
}
}
// 具体产品B
class ConcreteProductB implements Product {
public void use() {
System.out.println("使用产品B");
}
}
// Creator 抽象类
abstract class Creator {
public abstract Product factoryMethod();
public void doSomething() {
Product product = factoryMethod();
product.use();
}
}
// 具体工厂A
class ConcreteCreatorA extends Creator {
public Product factoryMethod() {
return new ConcreteProductA();
}
}
// 具体工厂B
class ConcreteCreatorB extends Creator {
public Product factoryMethod() {
return new ConcreteProductB();
}
}
```
七、总结
工厂方法模式通过将对象的创建交给子类处理,实现了对象创建与使用的解耦。它提高了系统的灵活性和可维护性,适用于需要动态扩展产品类型的场景。虽然增加了系统复杂度,但在大型项目中具有重要的应用价值。


