0
点赞
收藏
分享

微信扫一扫

【设计模式9】原型模式


脑图展开

【设计模式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】原型模式_数据_04

运行结果分析

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

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

代码

code

关于作者

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


举报

相关推荐

0 条评论