3.设计模式名称:工厂方法(Factory Method)
概念
工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法使一个类的实例化延迟到其子类。
意图
- 定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。
- 工厂方法让类的实例化推迟到子类中进行。
适用性
- 当一个类无法预测它需要创建的对象的类别时。
- 当一个类希望由其子类来指定创建的对象时。
- 当类将其责任委托给多个辅助子类中的一个,并且你想将哪个辅助子类是代理者这一信息局部化时。
结构
工厂方法模式通常涉及以下几个角色:
- Product:定义工厂方法所创建的对象的接口。
- ConcreteProduct:实现 Product 接口的具体类。
- Creator:声明工厂方法,该方法返回一个 Product 类型的对象。Creator 也可以定义一个工厂方法的默认实现,返回一个默认的 ConcreteProduct 对象。
- ConcreteCreator:重写工厂方法以返回一个 ConcreteProduct 实例。
实现代码示例
以下是使用 C++ 实现工厂方法模式的示例,定义了一个 Document
类的框架,并让具体的 Creator
类来决定实例化哪一个具体的 Document
类。
#include <iostream>
#include <string>
// Product
class Document {
public:
virtual void open() = 0;
virtual void close() = 0;
virtual ~Document() {}
};
// Concrete Products
class MyDocument : public Document {
public:
void open() override {
std::cout << "MyDocument opened." << std::endl;
}
void close() override {
std::cout << "MyDocument closed." << std::endl;
}
};
// Creator
class Application {
public:
virtual Document *createDocument() = 0; // Factory Method
void newDocument() {
Document *doc = createDocument();
doc->open();
doc->close();
delete doc;
}
virtual ~Application() {}
};
// Concrete Creator
class MyApplication : public Application {
public:
Document *createDocument() override {
return new MyDocument();
}
};
// Client code
int main() {
Application *app = new MyApplication();
app->newDocument();
delete app;
return 0;
}
输出
MyDocument opened.
MyDocument closed.
在这个例子中,Application
类提供了一个框架,其中包含了一个工厂方法 createDocument()
。具体的创建工作由 MyApplication
类完成,它实现了 createDocument()
方法来创建 MyDocument
实例。这样,Application
类的其他部分不需要知道具体的文档类型,从而使得系统更加灵活和可扩展。
这个模式的关键在于将产品的创建过程封装在一个方法中,使得修改或扩展产品的创建过程不需要修改使用产品的代码。这样不仅可以减少系统中各部分之间的依赖关系,还可以提高系统的可维护性和可扩展性。