设计模式-工厂模式

首先举个栗子:

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;
}

为什么这样新增业务时无须修改源代码?