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

总结

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

相关推荐
Doris_20235 小时前
代码格式化 使用oxfmt
设计模式·架构·前端框架
Doris_20235 小时前
说一说ESLint+Prettier生效的原理
前端·设计模式·架构
Pomelooooo7 小时前
把 git commit 这件事,彻底交给 AI ——一个工程化 /git-commit 命令的设计与落地
设计模式
玖釉-7 小时前
二叉树展开为链表:从先序遍历到原地指针重排
c++·windows·算法·leetcode·链表
Mister西泽7 小时前
C++ Primer Plus 第六版 编程练习题及详细答案
开发语言·c++·学习·visual studio
Qt程序员7 小时前
从上电到系统就绪:ARM+U-Boot 嵌入式 Linux 启动流程
linux·运维·c++·内核·设备树·嵌入式·ram
invicinble8 小时前
设计模式(类的拓扑结构)(描述总纲)
设计模式·原型模式
cany10008 小时前
C++ -- lambda捕获
c++
Kilicc_9 小时前
C++知识点—03 <C++宏代码生成/宏反射写法>
c++
invicinble10 小时前
设计模式(类的拓扑结构)(为什么会产生设计模式,以及什么是设计模式)
linux·服务器·设计模式