1. 工厂方法模式简介
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。该模式的核心思想是定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到其子类。
2. 模式结构与角色
工厂方法模式主要包含以下四种角色:
- 抽象产品(Product):定义产品的接口,是工厂方法所创建对象的超类型。
- 具体产品(Concrete Product):实现抽象产品接口的具体类。
- 抽象创建者/工厂(Creator/Factory):声明工厂方法,该方法返回一个抽象产品类型的对象。可以包含一些默认实现。
- 具体创建者/工厂(Concrete Creator/Factory):重写工厂方法以返回一个具体产品实例。
3. 模式实现示例
以下是一个简单的Java实现示例:
`java
// 1. 抽象产品
interface Product {
void operation();
}
// 2. 具体产品A
class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("执行产品A的操作");
}
}
// 3. 具体产品B
class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("执行产品B的操作");
}
}
// 4. 抽象创建者
abstract class Creator {
// 工厂方法
public abstract Product factoryMethod();
// 一些操作
public void someOperation() {
Product product = factoryMethod();
product.operation();
}
}
// 5. 具体创建者A
class ConcreteCreatorA extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductA();
}
}
// 6. 具体创建者B
class ConcreteCreatorB extends Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductB();
}
}
// 7. 客户端代码
public class FactoryMethodDemo {
public static void main(String[] args) {
Creator creatorA = new ConcreteCreatorA();
creatorA.someOperation(); // 输出:执行产品A的操作
Creator creatorB = new ConcreteCreatorB();
creatorB.someOperation(); // 输出:执行产品B的操作
}
}`
4. 模式优点
- 良好的封装性:客户端只需要知道所需产品的工厂,无需关心具体产品的创建细节。
- 扩展性高:增加新产品时,只需添加新的具体工厂类,无需修改原有代码,符合开闭原则。
- 解耦:将对象的创建与使用分离,降低了系统的耦合度。
- 可维护性:工厂方法集中了对象的创建逻辑,便于统一管理和维护。
5. 模式缺点
- 类数量增加:每增加一个产品,就需要增加一个具体产品类和具体工厂类,增加了系统的复杂度。
- 增加了系统的抽象性:理解难度相对增加,需要理解工厂和产品的层次结构。
6. 适用场景
- 当一个类不知道它必须创建的对象的具体类时。
- 当一个类希望由其子类来指定它所创建的对象时。
- 当需要将对象的创建与使用分离,以提高系统的灵活性和可维护性时。
- 在框架设计中,需要为不同的应用提供不同的实现时。
7. 工厂方法模式与简单工厂模式的区别
- 简单工厂模式:由一个工厂类根据传入的参数决定创建哪一种产品类的实例。
- 工厂方法模式:定义一个创建对象的接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类中。
工厂方法模式是简单工厂模式的进一步抽象和推广,它克服了简单工厂模式违背开闭原则的缺点,保持了封装对象创建过程的优点。
8. 实际应用示例
在Java标准库中,java.util.Collection接口的iterator()方法就是一个工厂方法。不同的集合类(如ArrayList、HashSet)实现了这个方法来返回适合自己数据结构的迭代器对象。
List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator(); // 工厂方法调用
9.
工厂方法模式是Java设计模式中最常用、最重要的模式之一。它通过将对象的创建过程封装在工厂类中,实现了创建与使用的分离,提高了系统的灵活性和可扩展性。在实际开发中,合理运用工厂方法模式能够使代码结构更加清晰,便于维护和扩展。
理解并掌握工厂方法模式,对于提高面向对象设计能力和编写高质量代码具有重要意义。