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

总结

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

相关推荐
码龄3年 审核中7 分钟前
设计模式、系统设计 record part03
设计模式
刷帅耍帅12 分钟前
设计模式-外观模式
设计模式·外观模式
咖啡里的茶i22 分钟前
C++之继承
c++
NormalConfidence_Man31 分钟前
C++新特性汇总
开发语言·c++
刷帅耍帅1 小时前
设计模式-迭代器模式
设计模式·迭代器模式
风清扬_jd1 小时前
Chromium 中JavaScript Fetch API接口c++代码实现(二)
javascript·c++·chrome
liu_chunhai1 小时前
设计模式(3)builder
java·开发语言·设计模式
刷帅耍帅1 小时前
设计模式-策略模式
设计模式·策略模式
冷白白1 小时前
【C++】C++对象初探及友元
c语言·开发语言·c++·算法
睡觉然后上课2 小时前
c基础面试题
c语言·开发语言·c++·面试