简单工厂模式(Simple Factory Pattern)是设计模式中的一种创建型模式,主要用于创建对象时不需要指定具体类,而是通过一个共同的接口来指向新创建的对象。简单工厂模式让类的实例化延迟到子类中进行,通常用于创建一个或多个相互关联或依赖对象的家族,并且不需要指定具体类的情况下创建这些对象。
![图片[1]_C++ 设计模式初探:简单工厂模式的实现与应用_知途无界](https://zhituwujie.com/wp-content/uploads/2024/08/d2b5ca33bd20240818125202.png)
简单工厂模式的核心思想
- 定义一个接口:首先定义一个产品接口,用于规范产品的行为。
- 创建具体产品类:实现产品接口的具体产品类。
- 创建工厂类:包含一个静态方法,根据传入的信息生成对应类的实例。
简单工厂模式的结构
- 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;}};#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; } };#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}};// 日志记录器工厂类 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 } };// 日志记录器工厂类 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;}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; }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
暂无评论内容