简单工厂模式(Simple Factory Pattern)是设计模式中的一种创建型模式,主要用于创建对象时不需要指定具体类,而是通过一个共同的接口来指向新创建的对象。简单工厂模式让类的实例化延迟到子类中进行,通常用于创建一个或多个相互关联或依赖对象的家族,并且不需要指定具体类的情况下创建这些对象。
简单工厂模式的核心思想
- 定义一个接口:首先定义一个产品接口,用于规范产品的行为。
- 创建具体产品类:实现产品接口的具体产品类。
- 创建工厂类:包含一个静态方法,根据传入的信息生成对应类的实例。
简单工厂模式的结构
- Product(抽象产品):定义了产品的接口,是工厂方法模式所创建的对象的超类型,也就是产品对象的共同接口。
- ConcreteProduct(具体产品):实现了Product接口的具体产品。
- Creator(工厂类):提供了创建产品的接口,调用者通过它访问具体产品的创建业务。
示例代码
假设我们要设计一个简单的日志系统,可以创建不同类型的日志记录器(如文件日志记录器、控制台日志记录器等)。
首先定义日志记录器的接口(Product):
#include <iostream>
// 日志记录器的接口
class Logger {
public:
virtual ~Logger() {}
virtual void write(const std::string& message) = 0; // 抽象方法,用于写日志
};
// 文件日志记录器
class FileLogger : public Logger {
public:
void write(const std::string& message) override {
std::cout << "FileLogger: " << message << std::endl;
}
};
// 控制台日志记录器
class ConsoleLogger : public Logger {
public:
void write(const std::string& message) override {
std::cout << "ConsoleLogger: " << message << std::endl;
}
};
接下来创建工厂类(Creator):
// 日志记录器工厂类
class LoggerFactory {
public:
static Logger* createLogger(const std::string& type) {
if (type == "file") {
return new FileLogger();
} else if (type == "console") {
return new ConsoleLogger();
}
return nullptr; // 如果传入的类型不是预期的,则返回nullptr
}
};
最后,使用工厂类创建日志记录器对象并调用:
int main() {
Logger* logger1 = LoggerFactory::createLogger("file");
if (logger1) {
logger1->write("This is a file logger.");
}
Logger* logger2 = LoggerFactory::createLogger("console");
if (logger2) {
logger2->write("This is a console logger.");
}
// 清理资源
delete logger1;
delete logger2;
return 0;
}
优点
- 工厂类封装了对象的创建逻辑,使得客户端代码不需要关心对象的创建细节。
- 当需要新增产品类型时,只需新增相应的具体产品类和在工厂类中添加相应的逻辑即可,符合开闭原则(对扩展开放,对修改关闭)。
缺点
- 工厂类职责过重,一旦需要生产的产品类型较多时,会造成工厂类非常庞大。
- 简单工厂模式不符合开闭原则,因为每增加一种产品,都需要修改工厂类的代码。尽管可以通过配置文件或数据库来避免修改代码,但这种方式会增加系统的复杂度和维护成本。
简单工厂模式适用于产品类型较少且不会有太大变化的情况。对于复杂系统,可能需要考虑使用工厂方法模式或抽象工厂模式。
© 版权声明
文中内容均来源于公开资料,受限于信息的时效性和复杂性,可能存在误差或遗漏。我们已尽力确保内容的准确性,但对于因信息变更或错误导致的任何后果,本站不承担任何责任。如需引用本文内容,请注明出处并尊重原作者的版权。
THE END
暂无评论内容