首页 > 编程笔记 > C++笔记 阅读:26

C++工厂模式详解(附带实例)

工厂方法模式是一种非常实用的设计模式,尽管它的名字听起来可能有些抽象。其核心思想是定义一个用于创建对象的接口,让子类决定实例化哪个类。这使得类的实例化延迟到其子类。

工厂方法模式在开发中的应用非常广泛,因为它帮助解耦了对象的创建和使用,使得系统更易于扩展和维护。

在深入讨论工厂方法模式之前,有必要先提到简单工厂。简单工厂虽然不是正式的设计模式,但它是一种常用的对象创建实践。简单工厂通过一个独立的类来封装对象的创建过程,这样当在需要新对象时,代码不再直接实例化类,而是通过工厂类获取。尽管简单工厂简单有效,但它在应对类的增加时往往显得不足,因为每次添加新类都需要修改工厂类,这违反了开闭原则。

与简单工厂相比,工厂方法模式提供了一种更加灵活的方式来扩展产品类,因为它允许类在不修改现有代码的情况下引入新的类型。这可以通过定义一个用于创建对象的接口,并让子类实现该接口以确定实例化哪个特定类来实现,从而完成扩展。

工厂方法的思想

在工厂方法模式中,创建对象的任务被转移到实现了工厂接口的具体子类中,从而使得添加新产品类时,系统无须修改已有代码。这种模式特别有助于创建复杂对象,其创建过程需要大量配置选项或依赖不同条件。

工厂方法模式体现了“依赖倒置原则”,即:
在这种情境下,高层模块是调用工厂的代码,低层模块是具体的产品实现类,而抽象则是工厂和产品的接口。工厂方法模式如下图所示:


图 1 工厂方法模式

在工厂方法模式中,核心角色包括:

工厂方法模式的应用场景

工厂方法模式主要应用在以下场景:

工厂方法实例展示

考虑一个简单的日志记录系统,我们可能需要根据不同的运行环境(开发环境、生产环境)来决定是否将日志信息输出到控制台或者文件。
class Logger {
public:
    virtual void log(const std::string& message) = 0;
};
class ConsoleLogger : public Logger {
public:
    void log(const std::string& message) override {
        std::cout << "Console log: " << message << std::endl;
    }
};
class FileLogger : public Logger {
public:
    void log(const std::string& message) override {
        // 将消息写入文件的代码
    }
};
class LoggerFactory {
public:
    virtual Logger* createLogger() = 0;
};
class ConsoleLoggerFactory : public LoggerFactory {
public:
    Logger* createLogger() override {
        return new ConsoleLogger();
    }
};
class FileLoggerFactory : public LoggerFactory {
public:
    Logger* createLogger() override {
       return new FileLogger();
    }
};
通过使用工厂方法模式,我们的代码不直接依赖于具体的日志类,而是依赖于一个抽象的 Logger 接口。这样,我们可以轻松地添加新的日志方法,或者更改日志记录的方式,而不需要修改依赖于日志的代码。

相关文章