工厂方法模式(Factory Method)是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
意图
工厂方法模式的主要目的是定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪一个类。工厂方法让类的实例化延迟到其子类。
应用场景
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望由它的子类来指定它所创建的对象时。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪个帮助子类是代理者这一信息局部化时。
实现
假设我们要创建一个基于C++的应用程序,它可以处理不同类型的文档。每种类型的文档都有不同的处理方式。这里我们可以使用工厂方法模式,定义一个创建对象的接口,让子类决定实例化哪一个类。文档可以是Word文档、PDF文档等。
首先,我们定义一个Document
接口和几个实现这个接口的具体类。
#include <iostream>
#include <string>
// Document 类,充当产品接口
class Document {
public:
virtual void Open() = 0;
virtual void Close() = 0;
virtual ~Document() {}
};
// 具体产品类:WordDocument
class WordDocument : public Document {
public:
void Open() override {
std::cout << "Word Document Opened." << std::endl;
}
void Close() override {
std::cout << "Word Document Closed." << std::endl;
}
};
// 具体产品类:PDFDocument
class PDFDocument : public Document {
public:
void Open() override {
std::cout << "PDF Document Opened." << std::endl;
}
void Close() override {
std::cout << "PDF Document Closed." << std::endl;
}
};
接下来,我们定义一个Application
类,它有一个工厂方法CreateDocument
,由子类实现。
// Application 类,充当创建者
class Application {
public:
virtual Document* CreateDocument() = 0;
void NewDocument() {
Document* doc = CreateDocument();
doc->Open();
}
virtual ~Application() {}
};
// 具体创建者类:WordApplication
class WordApplication : public Application {
public:
Document* CreateDocument() override {
return new WordDocument();
}
};
// 具体创建者类:PDFApplication
class PDFApplication : public Application {
public:
Document* CreateDocument() override {
return new PDFDocument();
}
};
最后,客户端代码可以这样使用:
int main() {
Application* app = new WordApplication();
app->NewDocument(); // 创建并打开Word文档
delete app; // 记得释放资源
app = new PDFApplication();
app->NewDocument(); // 创建并打开PDF文档
delete app; // 记得释放资源
return 0;
}
总结
工厂方法模式通过定义一个创建对象的接口并让子类决定实例化哪个类来实现对象的创建,这样的设计使得工厂方法模式能够解决接口选择问题,同时也保持了系统的灵活性和可扩展性。