工厂模式a
在你的 TaskFactory
类中,createTask
方法被声明为 static
,这是出于以下原因:
1. 工厂方法的特性
工厂方法(Factory Method)是一种设计模式,用于封装对象的创建逻辑。工厂类通常提供一个静态方法来创建对象,这样可以避免实例化工厂类本身。静态方法可以直接通过类名调用,而不需要创建类的实例。
2. 为什么使用 static
- 无需实例化工厂类:如果
createTask
不是静态方法,那么你需要先创建一个TaskFactory
的实例,然后才能调用createTask
方法。使用静态方法可以直接通过类名调用,更加简洁。 - 逻辑清晰:工厂方法的主要目的是创建对象,而不是维护任何实例状态。静态方法适合这种场景,因为它不会依赖于类的实例状态。
- 符合工厂模式的惯例:在工厂模式中,工厂方法通常是静态的,这已经成为一种常见的编程惯例。
示例代码
以下是你的代码的完整实现,包括 Task
、MetricTask
和 MillimeterTask
的定义:
#include <QString>
#include <iostream>
// 基类 Task
class Task {
public:
virtual ~Task() {}
virtual void execute() = 0; // 纯虚函数,确保子类实现 execute 方法
};
// 子类 MetricTask
class MetricTask : public Task {
public:
void execute() override {
std::cout << "Executing Metric Task" << std::endl;
}
};
// 子类 MillimeterTask
class MillimeterTask : public Task {
public:
void execute() override {
std::cout << "Executing Millimeter Task" << std::endl;
}
};
// 工厂类 TaskFactory
class TaskFactory {
public:
static Task* createTask(const QString& taskType) {
if (taskType == "metric") {
return new MetricTask();
} else if (taskType == "millimeter") {
return new MillimeterTask();
} else {
return nullptr;
}
}
};
使用示例
以下是如何使用 TaskFactory
来创建任务并执行的示例:
#include <QString>
int main() {
// 使用工厂方法创建任务
Task* task1 = TaskFactory::createTask("metric");
if (task1) {
task1->execute(); // 输出: Executing Metric Task
delete task1; // 释放内存
}
Task* task2 = TaskFactory::createTask("millimeter");
if (task2) {
task2->execute(); // 输出: Executing Millimeter Task
delete task2; // 释放内存
}
Task* task3 = TaskFactory::createTask("unknown");
if (!task3) {
std::cout << "Unknown task type" << std::endl;
}
return 0;
}
输出
Executing Metric Task
Executing Millimeter Task
Unknown task type
总结
- 使用
static
的原因:工厂方法通常不需要依赖类的实例状态,因此使用静态方法可以避免实例化工厂类,使代码更加简洁和清晰。 - 工厂模式的优点:通过工厂方法,可以将对象的创建逻辑封装起来,使得代码更加模块化,便于扩展和维护。例如,如果需要添加新的任务类型,只需在
createTask
方法中添加一个新的分支即可。