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

总结

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

相关推荐
千千寰宇7 小时前
[设计模式/Java/多线程] 设计模式之单例模式【9】
设计模式·操作系统-进程/线程/并发
此木|西贝13 小时前
【设计模式】原型模式
java·设计模式·原型模式
懒羊羊大王&14 小时前
模版进阶(沉淀中)
c++
owde14 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
GalaxyPokemon14 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
W_chuanqi14 小时前
安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft
tadus_zeng15 小时前
Windows C++ 排查死锁
c++·windows
EverestVIP15 小时前
VS中动态库(外部库)导出与使用
开发语言·c++·windows
胡斌附体16 小时前
qt socket编程正确重启tcpServer的姿势
开发语言·c++·qt·socket编程
GalaxyPokemon16 小时前
Muduo网络库实现 [十] - EventLoopThreadPool模块
linux·服务器·网络·c++