设计模式-3.工厂方法(Factory Method)C++实现

3.设计模式名称:工厂方法(Factory Method)

概念

工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法使一个类的实例化延迟到其子类。

意图
  • 定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。
  • 工厂方法让类的实例化推迟到子类中进行。
适用性
  • 当一个类无法预测它需要创建的对象的类别时。
  • 当一个类希望由其子类来指定创建的对象时。
  • 当类将其责任委托给多个辅助子类中的一个,并且你想将哪个辅助子类是代理者这一信息局部化时。
结构

工厂方法模式通常涉及以下几个角色:

  1. Product:定义工厂方法所创建的对象的接口。
  2. ConcreteProduct:实现 Product 接口的具体类。
  3. Creator:声明工厂方法,该方法返回一个 Product 类型的对象。Creator 也可以定义一个工厂方法的默认实现,返回一个默认的 ConcreteProduct 对象。
  4. ConcreteCreator:重写工厂方法以返回一个 ConcreteProduct 实例。

在这里插入图片描述

实现代码示例

以下是使用 C++ 实现工厂方法模式的示例,定义了一个 Document 类的框架,并让具体的 Creator 类来决定实例化哪一个具体的 Document 类。

#include <iostream>
#include <string>

// Product
class Document {
public:
    virtual void open() = 0;

    virtual void close() = 0;

    virtual ~Document() {}
};

// Concrete Products
class MyDocument : public Document {
public:
    void open() override {
        std::cout << "MyDocument opened." << std::endl;
    }

    void close() override {
        std::cout << "MyDocument closed." << std::endl;
    }
};

// Creator
class Application {
public:
    virtual Document *createDocument() = 0;  // Factory Method
    void newDocument() {
        Document *doc = createDocument();
        doc->open();
        doc->close();
        delete doc;
    }

    virtual ~Application() {}
};

// Concrete Creator
class MyApplication : public Application {
public:
    Document *createDocument() override {
        return new MyDocument();
    }
};

// Client code
int main() {
    Application *app = new MyApplication();
    app->newDocument();
    delete app;
    return 0;
}
输出
MyDocument opened.
MyDocument closed.

在这个例子中,Application 类提供了一个框架,其中包含了一个工厂方法 createDocument()。具体的创建工作由 MyApplication 类完成,它实现了 createDocument() 方法来创建 MyDocument 实例。这样,Application 类的其他部分不需要知道具体的文档类型,从而使得系统更加灵活和可扩展。

这个模式的关键在于将产品的创建过程封装在一个方法中,使得修改或扩展产品的创建过程不需要修改使用产品的代码。这样不仅可以减少系统中各部分之间的依赖关系,还可以提高系统的可维护性和可扩展性。

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值