C++设计模式:原型模式(八)

1、定义与动机
  • 定义:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

  • 动机:

    • 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一直的接口
    • 如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离处“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?
  • 个人理解:当一个类对象创建复杂、或者需要当前状态且当前状态这个对象又不允许被破坏的情况下,为了重复利用就可以考虑使用原型模式来clone一个对象。

2、原型模式
  • 将工厂模式可以改装成一个原型模式,通过调用clone方法创建一个新的对象。
  • 原型模式的核心是深拷贝的拷贝构造
  • 然后再过新创建的对象来执行指定的工作
class ISplitter{
public:
    virtual void split() = 0;
    virtual ISplitter* clone() = 0;
    virtual ~ISplitter(){}
};
class VideoSplitter: ISplitter{
private:
    int* value;
public:
    VideoSplitter(){

    }
    virtual void split() override{
        // ...
    }
    virtual ISplitter* clone() override{
        return new VideoSplitter(*this);
    }
    VideoSplitter(const VideoSplitter& v){
        // 深拷贝构造函数
        // ....
        this->value = new int(*(v.value));
        // ....
    }
    ~VideoSplitter(){
        delete value;
        value = nullptr;
    }
};
class FileSplitter: public ISplitter{
private:
    int* value;
public:
    virtual void split() override{
        // ...
    }
    virtual ISplitter* clone() override{
        return new FileSplitter(*this);
    }
};
class MainForm: public Form{
private:
    ISplitter *prototype;
public:
    MainForm(ISplitter *iSplitter): prototype(iSplitter){

    }
    void button_event(){
        ISplitter* splitter = prototype->clone();
        splitter->split(...);
        delete splitter;
        splitter = nullptr;
    }
};

void process()
{
    MainForm* mainForm = new MainForm(new FileSplitter());
    mainForm->button_event();
}
3、总结
  • Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。
  • Prototype模式用于“如何创建易变类的实体对象”采用“原型克隆的方法来做”,它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象——所需工作仅仅是注册一个心累的对象(即原型),然后再任何需要的地方Clone。
  • Prototype模式中的Clone方法可以利用某些框架中的序列化来实现深拷贝,例如Java语言;C++中一般采用拷贝构造函数进行深拷贝。
    在这里插入图片描述

相关推荐

  1. C++11 设计模式5. 原型模式

    2024-04-10 05:58:10       27 阅读
  2. 设计模式原型模式

    2024-04-10 05:58:10       63 阅读
  3. 设计模式——原型模式

    2024-04-10 05:58:10       50 阅读
  4. 设计模式-原型模式

    2024-04-10 05:58:10       58 阅读
  5. 设计模式-原型模式

    2024-04-10 05:58:10       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-10 05:58:10       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 05:58:10       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 05:58:10       87 阅读
  4. Python语言-面向对象

    2024-04-10 05:58:10       96 阅读

热门阅读

  1. 在QT里使用TCP进行网络通信

    2024-04-10 05:58:10       29 阅读
  2. Android 14 vold 分析(1)启动

    2024-04-10 05:58:10       24 阅读
  3. Android 14 vold 分析(2)VolumeManager 和 NetlinkManger

    2024-04-10 05:58:10       27 阅读
  4. MyBatis事务管理

    2024-04-10 05:58:10       32 阅读
  5. 手写一个民用Tomcat (03)

    2024-04-10 05:58:10       31 阅读
  6. Android 14 vold 分析(3)vold和mount service通信

    2024-04-10 05:58:10       29 阅读
  7. 小程序中展示富文本 图片不适配?视频不显示?

    2024-04-10 05:58:10       44 阅读
  8. CentOS 7关机与重启命令详解

    2024-04-10 05:58:10       46 阅读