首先举个栗子:
logger* logger = new FileLogger();
logger->log("Hello");
可以看出logger的对象创建过程和logger耦合,如果要修改不使用Filelogger(),比如使用控制台输出日志,则需要重写代码违反了开闭原则。
为此我们需要将创建过程和对象的使用分开。
解决方案:
// 产品接口
class Logger {
public:
virtual void log(const std::string& message) = 0;
virtual ~Logger() = default;
};
// 具体产品A:文件日志
class FileLogger : public Logger {
public:
void log(const std::string& message) override {
std::cout << "[File] " << message << std::endl;
}
};
// 具体产品B:控制台日志
class ConsoleLogger : public Logger {
public:
void log(const std::string& message) override {
std::cout << "[Console] " << message << std::endl;
}
};
// 工厂接口
class LoggerFactory {
public:
virtual Logger* createLogger() = 0;
virtual ~LoggerFactory() = default;
};
// 具体工厂A:创建文件日志
class FileLoggerFactory : public LoggerFactory {
public:
Logger* createLogger() override {
return new FileLogger();
}
};
// 具体工厂B:创建控制台日志
class ConsoleLoggerFactory : public LoggerFactory {
public:
Logger* createLogger() override {
return new ConsoleLogger();
}
};
客户端使用
int main() {
LoggerFactory* factory = new ConsoleLoggerFactory(); // 可以换成 FileLoggerFactory()
Logger* logger = factory->createLogger();
logger->log("Hello, factory method!");
delete logger;
delete factory;
return 0;
}
为什么这样新增业务时无须修改源代码?