工厂方法模式是设计模式中的一种创建型模式,它遵循“开闭原则”,即对扩展开放,对修改关闭。这种模式提供了创建对象的接口,但允许子类决定实例化哪一个类,将实例化的责任延迟到子类中。工厂方法模式的核心在于工厂接口和工厂实现。
在工厂方法模式中,有以下几个关键角色:
1. **工厂接口(IFactory)**:这是工厂方法模式的核心,定义了一个创建对象的接口,使得调用者能够通过这个接口获取所需的产品。在示例代码中,`IFactory` 接口有一个`createProduct()`方法,用于创建产品。
2. **工厂实现(Factory)**:实现了工厂接口的类,负责具体的产品实例化工作。在示例中,`Factory` 类实现了`IFactory`接口,并返回了`Product`的实例。
3. **产品接口(IProduct)**:定义了产品的公共行为,所有产品类都需要实现这个接口。在代码中,`IProduct` 接口有一个`productMethod()`方法。
4. **产品实现(Product)**:实现了产品接口的具体类,代表了实际被创建的对象。在示例中,`Product` 类实现了`IProduct`接口,定义了`productMethod()`的行为。
工厂方法模式的主要优点:
- **封装变化**:将对象的创建过程封装在工厂类中,使得调用者无需关心产品是如何创建的,降低了系统的复杂度。
- **解耦**:调用者只依赖于产品接口,而不是具体的产品实现,降低了类间的耦合度。
- **扩展性**:通过添加新的工厂类,可以轻松地添加新产品,而无需修改原有代码,符合“开闭原则”。
适用场景:
- 当需要生成复杂对象,且创建过程较为复杂或依赖于多个类时,使用工厂方法模式可以更好地组织代码。
- 当系统需要对组件进行解耦,避免直接依赖具体产品类时,可以采用工厂方法模式。
- 当系统需要有良好的扩展性,允许添加新产品而不修改现有代码时,工厂方法模式是一个很好的选择。
典型应用:
汽车制造是一个很好的例子。汽车的组成部分(如发动机、轮胎和底盘)可以看作是产品,而汽车制造商则是工厂。不同类型的汽车(如轿车、SUV)有不同的部件组合,这就需要不同的工厂(子类)来创建。工厂方法模式允许汽车制造商(工厂实现)决定使用哪种类型的部件(产品实现),而购车者(调用者)只需指定汽车类型,无需关心汽车的组装细节。这样,即使汽车的配置发生改变,购车者也不需要修改代码,只需更换工厂即可。