Factory Method模式通过定义创建对象的接口,由子类决定实例化具体类,实现对象创建与使用的解耦。以日志系统为例,首先定义抽象产品Logger,声明write接口;接着实现FileLogger和ConsoleLogger等具体产品类,分别重写write方法以实现不同输出逻辑;然后定义工厂基类LoggerFactory,提供创建Logger的纯虚函数createLogger;再由FileLoggerFactory和ConsoleLoggerFactory等具体工厂类实现该方法,返回对应的日志对象;客户端仅依赖抽象工厂和产品接口,无需关心具体类型,从而实现灵活扩展与维护。

工厂模式在C++中用于解耦对象的创建过程,让子类决定实例化哪一个类。它适用于需要根据不同的条件创建不同类型的对象,但又希望调用方无需关心具体类型的情况。Factory Method 模式是其中一种经典实现方式。
Factory Method 模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。这样,父类把对象的创建延迟到子类中完成,提高了扩展性。
核心思想是:把“创建对象”的逻辑封装起来,客户端只依赖抽象接口,不直接使用 new 创建具体类。
假设我们要设计一个日志系统,支持文件日志和控制台日志两种输出方式,通过工厂方法动态创建对应的日志处理器。
立即学习“C++免费学习笔记(深入)”;
步骤一:定义产品接口
所有具体产品都继承自同一个基类:
Logger.h
class Logger {
public:
virtual void write(const std::string& message) = 0;
virtual ~Logger() = default;
};
步骤二:实现具体产品
FileLogger.h
class FileLogger : public Logger {
public:
void write(const std::string& message) override {
std::cout
}
};
ConsoleLogger.h
class ConsoleLogger : public Logger {
public:
void write(const std::string& message) override {
std::cout
}
};
步骤三:定义工厂接口
工厂基类声明一个创建产品的纯虚函数:
LoggerFactory.h
class LoggerFactory {
public:
virtual Logger* createLogger() = 0;
virtual ~LoggerFactory() = default;
};
步骤四:实现具体工厂
每个具体工厂负责创建对应的具体产品:
FileLoggerFactory.h
class FileLoggerFactory : public LoggerFactory {
public:
Logger* createLogger() override {
return new FileLogger();
}
};
ConsoleLoggerFactory.h
class ConsoleLoggerFactory : public LoggerFactory {
public:
Logger* createLogger() override {
return new ConsoleLogger();
}
};
步骤五:客户端使用工厂
客户端通过工厂接口获取对象,无需知道具体类名:
int main() {
LoggerFactory* factory = nullptr;
std::string type = "file"; // 或 "console"
if (type == "file") {
factory = new FileLoggerFactory();
} else {
factory = new ConsoleLoggerFactory();
}
Logger* logger = factory->createLogger();
logger->write("Test message");
delete logger;
delete factory;
return 0;
}
上面的例子用了 raw pointer 和 new/delete,容易出错。现代 C++ 推荐使用智能指针管理资源。
将工厂返回类型改为 std::unique_ptr:
class LoggerFactory {
public:
virtual std::unique_ptr<Logger> createLogger() = 0;
virtual ~LoggerFactory() = default;
};
class FileLoggerFactory : public LoggerFactory {
public:
std::unique_ptr<Logger> createLogger() override {
return std::make_unique<FileLogger>();
}
};
客户端代码更安全:
auto factory = std::make_unique<FileLoggerFactory>();
auto logger = factory->createLogger();
logger->write("Safe with smart pointers");
Factory Method 适合以下情况:
优点包括:
基本上就这些。使用 Factory Method 能有效组织对象创建逻辑,提升代码可维护性和灵活性。
以上就是C++怎么实现一个工厂模式_C++常用设计模式之Factory Method的应用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号