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 小时前
基于 C++ 实现两个有序链表序列的交集
java·c++·链表
hansang_IR7 小时前
【题解】[APIO2023] 赛博乐园 / cyberland
c++·算法·图论
落羽的落羽8 小时前
【AI】快速理解AI应用的相关名词概念
linux·c++·人工智能·python·计算机网络·算法
刚入门的大一新生8 小时前
Linux-进程控制
linux·运维·服务器·c++
刃神太酷啦8 小时前
Redis 进阶核心:持久化 (RDB/AOF)、事务与主从复制全解析----《Hello Redis!》(5)
linux·c语言·数据库·c++·redis·缓存·bootstrap
喜欢吃燃面11 小时前
深入 C++ STL:从 unordered_set与unordered_map到底层哈希表的原理与实现
数据结构·c++·散列表
FlightYe12 小时前
音视频修炼之基础理论(五):AAC格式与解析
android·linux·c++·音视频·aac
ShineWinsu13 小时前
对于MySQL:数据库的操作的解析
linux·数据库·c++·mysql·面试·笔试·库的操作
云小逸13 小时前
C++ 第一阶段:对象、内存与生命周期
开发语言·c++
夜航海图13 小时前
S-57 数据解剖:把一个 ENC 文件拆给你看
c++