首页 > 其他分享 >【设计模式9】原型模式

【设计模式9】原型模式

时间:2023-04-10 15:32:02浏览次数:32  
标签:return Resume 模式 sex rhsTest 原型 QString obj 设计模式


脑图展开

【设计模式9】原型模式_数据

一般模型

【设计模式9】原型模式_数据_02

具体案例(Qt,C++)

定义相关类,实现个人简历的初始化和拷贝工作,其中简历的数据成员包括:姓名、性别、年龄、任职时段、任职公司,以及用于观察浅拷贝的引用(指针)成员;

class ICloneable
{
public:
    ICloneable();
    virtual ICloneable *Clone()=0;//抽象的Clone 方法
    ICloneable(QString id){
        this->id=id;
    }
    QString getId(){
        return id;
    }


private:
    QString id;

};


class Resume:public ICloneable
{
public:
    Resume(){}
    Resume(QString name){
        this->name=name;
        rhsTest=new QString;
    }

    //设置个人信息
    void setPersonalInfo(QString sex,QString age){
        this->sex=sex;
        this->age=age;
    }

    //设置工作经历
    void setWorkExperience(QString timeArea,QString company){
        this->timeArea=timeArea;
        this->company=company;
    }

    //设置引用对象
    void setRhsObj(QString rhs){
        *(this->rhsTest)=rhs;
    }

    //显示
    void Display(){

    };

    ICloneable *Clone()
    {
        Resume *obj=new Resume(this->name);
        obj->sex=this->sex;
        obj->age=this->age;
        obj->timeArea=this->timeArea;
        obj->company=this->company;
        obj->rhsTest=this->rhsTest;
        return obj;
    }

    QString getName(){
        return this->name;
    }
    QString getSex(){
        return this->sex;
    }
    QString getTimeArea(){
        return this->timeArea;
    }
    QString getCompany(){
        return this->company;
    }
    QString getRhsObj(){
        return *(this->rhsTest);
    }


private:
    QString name;
    QString sex;
    QString age;
    QString timeArea;
    QString company;
    QString *rhsTest; // 对象的引用,浅拷贝
};
void Widget::myResume()
{

    Resume *a=new Resume("徐念");
    a->setPersonalInfo(ui->sexEdit->text(),ui->yearsEdit->text());
    a->setWorkExperience(ui->timeEdit->text(),ui->companyEdit->text());
    a->setRhsObj("rhsobj1");

    Resume *b=(Resume*)a->Clone();
    b->setWorkExperience("2016-2018","ABB");
    b->setRhsObj("rhsobj2");

    Resume *c=(Resume*)a->Clone();
    c->setWorkExperience("2019-2020","苏州微软");
    c->setRhsObj("rhsobj3");
    Resume *&d=a;
//    a->Display();
//    b->Display();
//    c->Display();
    ui->showEdit->append(a->getName()+QString("\t")+a->getSex()+QString("\t")
                            +a->getTimeArea()+QString("\t")+a->getCompany()
                         +QString("\t")+a->getRhsObj());
    ui->showEdit->append(b->getName()+QString("\t")+b->getSex()+QString("\t")
                            +b->getTimeArea()+QString("\t")+b->getCompany()
                         +QString("\t")+b->getRhsObj());
    ui->showEdit->append(c->getName()+QString("\t")+c->getSex()+QString("\t")
                            +c->getTimeArea()+QString("\t")+c->getCompany()
                         +QString("\t")+c->getRhsObj());
    delete a,b,c;
}

实现效果

【设计模式9】原型模式_Qt_03


【设计模式9】原型模式_Qt_04

运行结果分析

我们在myResume()函数的 Resume *&d=a;后面打个断点,观察a,b,c,d各个 Resume 对象的地址,注意看图中涂成青色的三个对象的地址,我们不难发现a和d的地址是一样的,这是因为d是变量a的一个引用,也就是别名,故他们指向的地址是一致的,即最终的数据是共享的,也就是说引用实际是浅拷贝。再看原始代码,我们定义了rhsTest这一指针对象,在实际进行拷贝过程中,我们只是简单的将当前类的rhsTest 赋值给了拷贝对象,而其所指向的值并没有一同复制,这样两者共享内存,最终实现的也是浅拷贝了。

【设计模式9】原型模式_浅拷贝_05

代码

code

关于作者

长期从事编程相关研究,涉及Qt、机械臂、轮式机器人、四足机器人的建模及仿真,可共同探讨编程相关问题,可指导课程设计及毕业设计,详询:QQ:2963325158


标签:return,Resume,模式,sex,rhsTest,原型,QString,obj,设计模式
From: https://blog.51cto.com/u_16063698/6181012

相关文章

  • 【设计模式7】代理模式
    基本概念(1)代理模型:为其他对象提供一种代理以控制这个对象的访问。(2)代理模式的适用场景:远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实;虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,从而......
  • 函数声明、函数原型、函数定义
    定义”是指对函数功能的确立,包括指定函数名,函数值类型、形参类型、函数体等,它是一个完整的、独立的函数单位。而“声明”的作用则是把函数的名字、函数类型以及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数......
  • 设计模式-代理模式
    定义为其他对象提供一种代理以控制对这个对象的访问类图时序图角色定义抽象主体角色:抽象类或者接口,普通业务的定义具体主体角色:被代理角色,业务逻辑的具体执行者代理主体角色:委托类,代理类优缺点优点职责清晰,实现好内部结构即可,具体客户要求由代理进行分化高扩展性......
  • 面向对象 之 原型继承
    搞清楚constructor构造器、prototype构造原型、实例对象三者关系constructor就是构造函数的名字,prototype是原型对象,每个构造函数都必须有一个原型对象;构造函数要被继承的方法在这里存放才不会浪费堆区空间;构造函数里面的this,无论在构造函数里,还是在原型对象里都得指向实......
  • Java知识小拓展之适配器模式
    一:设计模式设计模式是一套被反复使用的、多数人知晓的、经过分类编写的、设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被人理解、保证代码的可靠性、程序的可靠性。简单的理解它就像给了你一个模板,是一种像数学中的一种解题套路一样,不同的是它有各种套路。二:适配器......
  • 云计算的三种模式IaaS/PaaS/SaaS/BaaS对比:SaaS架构设计分析
    SaaS——软件即服务(SoftwareasaService)的出现改变了传统使用软件转变为使用服务。SaaS与传统软件的最大区别是,前者按年付费租用服务,后者一次买断。这貌似只是“报价方式”的区别,实际上这是一个根本性的变化,这带来的是对服务模式、销售模式、公司价值等多维度的根本影响。传......
  • .NET Core MongoDB数据仓储和工作单元模式封装
    前言     上一章我们把系统所需要的MongoDB集合设计好了,这一章我们的主要任务是使用.NETCore应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式,因为本章内容涵盖的有点多关于仓储和工作单元的使用就放到下一章节中讲解了。仓储模式(Repository )带来的好处是一......
  • Rust语言 学习05 枚举与模式匹配
    一、定义枚举enumMessage{Quit,Move{x:i32,y:i32},Write(String),ChangeColor(i32,i32,i32),}fnmain(){letq=Message::Quit;letm=Message::Move{x:12,y:24};letw=Message::Write(String::from("Hello"));letc......
  • [权限]基于角色+权限配置模式
    基于角色+权限配置模式可以将权限粒度设置的更细致一些。具体参考前端:登录成功后,再获取权限列表,在页面上进行权限判断。后端:不变登录当用户登录时,将用户角色写入到vuex,保存当前用户角色信息。vuex中import{createStore}from'vuex'exportdefaultcreateStore({......
  • 挂件模式用挂载菜单的方式使用上手视频教程
    挂件模式用挂载菜单的方式使用上手视频教程jjj......