一、什么是工厂方法模式?
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定实例化哪个具体类。工厂方法使得类的实例化延迟到子类。
二、工厂方法模式的动机
在软件设计中,我们常常需要根据不同的条件创建不同的对象。如果直接在代码中使用new
关键字来实例化对象,不仅会导致代码的耦合度增加,还会使得系统难以扩展和维护。工厂方法模式通过将对象的创建委托给子类,解决了这一问题,使得系统更灵活、可扩展。
三、工厂方法模式的结构
工厂方法模式主要包含以下几个部分:
- 产品(Product):定义产品的接口。
- 具体产品(ConcreteProduct):实现产品接口的具体类。
- 创建者(Creator):声明工厂方法,返回一个产品对象。
- 具体创建者(ConcreteCreator):实现工厂方法,返回具体产品实例。
四、工厂方法模式的实现
下面我们通过一个简单的例子来实现工厂方法模式。假设我们需要创建不同类型的文档,例如Word文档和PDF文档。
// 产品接口
abstract class Document {abstract void open();
}// 具体产品类
class WordDocument extends Document {void open() {System.out.println("Opening Word document.");}
}class PdfDocument extends Document {void open() {System.out.println("Opening PDF document.");}
}// 创建者类
abstract class DocumentCreator {abstract Document createDocument();
}// 具体创建者类
class WordDocumentCreator extends DocumentCreator {Document createDocument() {return new WordDocument();}
}class PdfDocumentCreator extends DocumentCreator {Document createDocument() {return new PdfDocument();}
}// 客户端代码
public class Application {public static void main(String[] args) {DocumentCreator creator = new WordDocumentCreator();Document document = creator.createDocument();document.open();creator = new PdfDocumentCreator();document = creator.createDocument();document.open();}
}
五、工厂方法模式的优缺点
优点:
- 遵循开闭原则:通过引入新的具体创建者类来扩展系统,而无需修改现有代码。
- 更好的代码结构:将对象创建的职责封装在子类中,使得代码更清晰、更有组织。
- 提高代码的可维护性和可扩展性。
缺点:
- 增加了系统的复杂度:每增加一种产品,就需要增加一个具体创建者类。
- 可能导致类的个数增加:如果产品种类较多,会增加类的数量。
六、工厂方法模式的应用场景
工厂方法模式适用于以下场景:
- 当一个类无法预见需要创建哪种类的对象时。
- 当一个类希望由子类来指定创建对象时。
- 当类的实例化任务委托给多个帮助子类中的某一个执行,并且希望将哪一个帮助子类是哪个决定权交给客户端时。
七、工厂方法模式的实际应用
在实际应用中,工厂方法模式被广泛应用于各种框架和库中。例如,在Java的javax.xml.parsers.DocumentBuilderFactory
中,DocumentBuilderFactory
就是一个工厂方法模式的实现。
八、总结
工厂方法模式通过将对象的创建延迟到子类,提供了一种灵活的对象创建机制,遵循了开闭原则,适用于系统需要扩展和维护的场景。虽然增加了系统的复杂度,但其带来的高扩展性和高维护性使得它在软件设计中得到广泛应用。