当前位置: 首页 > news >正文

C++设计模式之Prototype原型模式

文章目录

    • 1.“对象”创建模式
    • 2.动机(Motivation)
    • 3.模式定义
    • 4.代码例子
    • 5.结构(Structure)
    • 6.要点总结

1.“对象”创建模式

通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。

  • 典型模式
    Factory Method
    Abstract Factory
    Prototype
    Builder

2.动机(Motivation)

在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。

如何应对这种变化?如何向”客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?

3.模式定义

使用_原型实例_指定创建对象的种类,然后通过_拷贝(深拷贝)_这些原型来创建新的对象。 ————《设计模式》GoF

4.代码例子

//prototype.cpp 
//抽象类
class ISplitter{
public:
    virtual void split()=0;
    virtual ISplitter* clone()=0; //通过克隆自己来创建对象
    
    virtual ~ISplitter(){}

};

//ConcretePrototype.cpp
//具体类
class BinarySplitter : public ISplitter{
public:
    virtual ISplitter* clone(){
        return new BinarySplitter(*this);//深拷贝
    }
};

class TxtSplitter: public ISplitter{
public:
    virtual ISplitter* clone(){
        return new TxtSplitter(*this);
    }
};

class PictureSplitter: public ISplitter{
public:
    virtual ISplitter* clone(){
        return new PictureSplitter(*this);
    }
};

class VideoSplitter: public ISplitter{
public:
    virtual ISplitter* clone(){
        return new VideoSplitter(*this);
    }
};

//Client.cpp
class MainForm : public Form
{
    ISplitter*  prototype;//原型对象

public:
    
    MainForm(ISplitter*  prototype){
        this->prototype=prototype;
    }
    
	void Button1_Click(){

		ISplitter * splitter=
            prototype->clone(); //克隆原型
        
        splitter->split();
	}
};

5.结构(Structure)

  • Prototype是ISplitter,ConsretePrototype1是BinarySplitter,
  • Client相当于MainForm
    在这里插入图片描述
    当对象比较复杂的时候,初始状态又不是很好,不是很想用的时候。你有一个对象,这个对象状态很好。你去调用拷贝构造函数,调用已有的对象的状态,这样就不会很复杂。原型的灵活性在于,它的状态可以从传入的状态获取。

6.要点总结

Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。

Prototype模式对于“如何创建易变类的实体对象”采用“原型克隆”的方法来做,它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象——所需工作仅仅是_注册一个新类的对象(即原型)_,然后在需要的地方Clone。

Prototype模式中的Clone方法可以利用某些框架中的序列化来实现_深拷贝_。(Java)

  • 参考:C++设计模式入门,C++设计模式(十)原型模式

相关文章:

  • auto 关键字
  • LeetCode精选200道--二叉树篇(三)
  • 学生HTML个人网页作业作品:HTML绿色的化妆品静态网站(web前端网页制作课作业)
  • 力扣 1582. 二进制矩阵中的特殊位置
  • mybatis原理及整合spring原理
  • 数据结构——树形结构
  • R语言ggplot2可视化相关系数图(correlation analysis):通过数据点的大小以及颜色(双色渐变填充)表征相关性的强度
  • 【Java第25期】:File 类的用法和 InputStream, OutputStream 的用法
  • 阿里一面: Spring 有哪些扩展点?
  • 【dotnet】Unity 两种打包方式解析(IL2CPP Mono)
  • 空间数据结构管理---RTree(上篇)
  • leetcode每天5题-Day37
  • Elasticsearch入门开发
  • ETL性能优化
  • 猿创征文|【第11题】求坐上公交的最晚时间(考察贪心算法)
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【Leetcode】104. 二叉树的最大深度
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • ES6--对象的扩展
  • interface和setter,getter
  • JavaScript实现分页效果
  • java多线程
  • React系列之 Redux 架构模式
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 两列自适应布局方案整理
  • 前端之React实战:创建跨平台的项目架构
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 进程与线程(三)——进程/线程间通信
  • 说说我为什么看好Spring Cloud Alibaba
  • !!java web学习笔记(一到五)
  • #Linux(帮助手册)
  • #LLM入门|Prompt#3.3_存储_Memory
  • #微信小程序(布局、渲染层基础知识)
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (07)Hive——窗口函数详解
  • (12)目标检测_SSD基于pytorch搭建代码
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (LeetCode) T14. Longest Common Prefix
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计大学生兼职系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (七)c52学习之旅-中断
  • (一)Linux+Windows下安装ffmpeg
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net 生成二级域名
  • @RequestBody与@ModelAttribute
  • [acm算法学习] 后缀数组SA
  • [BZOJ4010]菜肴制作