C++的设计模式:工厂方法模式(Factory Method)

工厂方法模式(Factory Method)是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

意图

工厂方法模式的主要目的是定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪一个类。工厂方法让类的实例化延迟到其子类。

应用场景

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象时。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪个帮助子类是代理者这一信息局部化时。

实现

假设我们要创建一个基于C++的应用程序,它可以处理不同类型的文档。每种类型的文档都有不同的处理方式。这里我们可以使用工厂方法模式,定义一个创建对象的接口,让子类决定实例化哪一个类。文档可以是Word文档、PDF文档等。

首先,我们定义一个Document接口和几个实现这个接口的具体类。

复制代码
#include <iostream>
#include <string>

// Document 类,充当产品接口
class Document {
public:
    virtual void Open() = 0;
    virtual void Close() = 0;
    virtual ~Document() {}
};

// 具体产品类:WordDocument
class WordDocument : public Document {
public:
    void Open() override {
        std::cout << "Word Document Opened." << std::endl;
    }
    void Close() override {
        std::cout << "Word Document Closed." << std::endl;
    }
};

// 具体产品类:PDFDocument
class PDFDocument : public Document {
public:
    void Open() override {
        std::cout << "PDF Document Opened." << std::endl;
    }
    void Close() override {
        std::cout << "PDF Document Closed." << std::endl;
    }
};

接下来,我们定义一个Application类,它有一个工厂方法CreateDocument,由子类实现。

复制代码
// Application 类,充当创建者
class Application {
public:
    virtual Document* CreateDocument() = 0;
    void NewDocument() {
        Document* doc = CreateDocument();
        doc->Open();
    }
    virtual ~Application() {}
};

// 具体创建者类:WordApplication
class WordApplication : public Application {
public:
    Document* CreateDocument() override {
        return new WordDocument();
    }
};

// 具体创建者类:PDFApplication
class PDFApplication : public Application {
public:
    Document* CreateDocument() override {
        return new PDFDocument();
    }
};

最后,客户端代码可以这样使用:

复制代码
int main() {
    Application* app = new WordApplication();
    app->NewDocument(); // 创建并打开Word文档

    delete app; // 记得释放资源

    app = new PDFApplication();
    app->NewDocument(); // 创建并打开PDF文档

    delete app; // 记得释放资源

    return 0;
}

总结

工厂方法模式通过定义一个创建对象的接口并让子类决定实例化哪个类来实现对象的创建,这样的设计使得工厂方法模式能够解决接口选择问题,同时也保持了系统的灵活性和可扩展性。

相关推荐
郝学胜_神的一滴5 分钟前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt00114 小时前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
咖啡八杯17 小时前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
玖玥拾18 小时前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
один but you19 小时前
constexpr函数
c++
凡人叶枫19 小时前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++
凡人叶枫19 小时前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
小胖xiaopangss19 小时前
BRpc使用
c++·rpc
-森屿安年-20 小时前
63. 不同路径 II
c++·算法·动态规划
chase_my_dream20 小时前
Cartographer详细讲解
c++·人工智能·自动驾驶