【工厂方法模式】工厂方法模式是一种常用的创建型设计模式,它定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法将对象的创建与使用解耦,提高了系统的灵活性和可扩展性。
一、核心思想
工厂方法模式的核心在于“延迟绑定”或“动态绑定”,即在运行时根据不同的条件选择不同的具体类进行实例化。这种模式通过抽象工厂类定义创建对象的接口,而具体的对象创建则由子类来实现。
二、适用场景
场景描述 | 说明 |
多种类型对象需要创建 | 当系统中存在多个不同类型的对象,且它们的创建逻辑较为复杂时,适合使用工厂方法模式。 |
需要解耦对象的创建与使用 | 工厂方法模式可以将对象的创建过程封装起来,使得客户端代码不需要知道具体的类名。 |
系统需具备良好的扩展性 | 当系统未来可能增加新的产品类时,工厂方法模式可以让新增产品无需修改已有代码。 |
三、结构组成
组件 | 说明 |
抽象工厂(Creator) | 定义创建产品的接口,通常是一个抽象类或接口。 |
具体工厂(Concrete Creator) | 实现抽象工厂的接口,负责创建具体的产品对象。 |
抽象产品(Product) | 定义产品的公共接口或抽象类。 |
具体产品(Concrete Product) | 实际被创建的对象,继承自抽象产品。 |
四、优点
优点 | 说明 |
解耦性强 | 客户端代码与具体产品类解耦,提高系统的灵活性。 |
扩展性好 | 新增产品类时,只需添加新的具体工厂类,无需修改现有代码。 |
符合开闭原则 | 对扩展开放,对修改关闭。 |
五、缺点
缺点 | 说明 |
增加系统复杂度 | 引入了更多的类和接口,增加了系统的复杂性。 |
代码冗余 | 每个具体产品都需要一个对应的工厂类,可能导致重复代码。 |
不适用于简单对象 | 对于简单的对象创建,使用工厂方法模式反而显得繁琐。 |
六、示例代码(Java)
```java
// 抽象产品
interface Product {
void use();
}
// 具体产品A
class ProductA implements Product {
public void use() {
System.out.println("使用产品A");
}
}
// 具体产品B
class ProductB implements Product {
public void use() {
System.out.println("使用产品B");
}
}
// 抽象工厂
abstract class Creator {
public abstract Product factoryMethod();
}
// 具体工厂A
class CreatorA extends Creator {
public Product factoryMethod() {
return new ProductA();
}
}
// 具体工厂B
class CreatorB extends Creator {
public Product factoryMethod() {
return new ProductB();
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
Creator creator = new CreatorA();
Product product = creator.factoryMethod();
product.use(); // 输出:使用产品A
}
}
```
七、总结
工厂方法模式是一种有效的对象创建方式,特别适合需要动态创建不同类型对象的场景。它通过引入工厂类来封装对象的创建逻辑,提升了系统的灵活性和可维护性。虽然它会增加一定的类数量,但在大型系统中能够显著提升代码的可扩展性和可读性。