6.原型模式

来源:互联网 发布:mac论坛哪个好 编辑:程序博客网 时间:2024/06/06 04:40

1.说明
请参阅本文第一章
2.原型模式说明
原型模式:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象
通俗说话:创建一个和原来一模一样的对象,减少代码中使用动态来new的方式,并且不用知道任何的创建细节
3.UML
这里写图片描述
4.代码

 //个人信息类,通过不同的数据类型来测试原型模式中的复制状况 //当原型中的为指针类型时,为浅复制,其余均为深复制,且会调用复制构造函数 //BaseClone.h 原型基类接口#ifndef __BASECLONE_H#define __BASECLONE_H#include <iostream>#include <string>class CBaseClone{public:    virtual CBaseClone* Clone(){}};#endif //个人信息类#ifndef __WORKEXPRIENCE_H#define __WORKEXPRIENCE_H#include <iostream>class CWorkExprience{public:    void SetInfo(std::string time, std::string company)    {        m_time = time;        m_company = company;    }    std::string GetTime()    {        return m_time;    }    std::string GetCompany()    {        return m_company;    }private:    std::string m_time;    std::string m_company;};#endif//原型模式构造类#ifndef __RESUME_H#define __RESUME_H#include <vector>#include "BaseClone.h"#include "WorkExprience.h"//在原型模式中当 为值类型,类类型,复合类型(vector)均为 深复制//指针类型为浅复制  class CResume:public CBaseClone{public:    CResume()    {    }    /*CResume(CResume& par)    {        std::cout<<"this is nothing."<<std::endl;    }*/    void SetResumeName(std::string resuname)    {        m_resumename = resuname;    }    void SetInfo(std::string name, std::string sex)    {        m_name = name;        m_sex = sex;            }    //深浅复制测试区    void AddWorkExprience(std::string time, std::string company)    {        m_exprience.SetInfo(time, company);    }    void Add_set(std::string time, std::string company)    {        CWorkExprience exper;        exper.SetInfo(time, company);        m_exset.push_back(exper);    }    void Set_mon(int* p)    {        if (p != NULL)            m_mon = p;    }    //测试结束    void Display()    {        std::cout<<"resuname:"<<m_resumename.c_str()<<"  "<<m_name.c_str()<<"  "<<m_sex.c_str()<<std::endl;        std::cout<<m_exprience.GetTime()<<"  "<<m_exprience.GetCompany()<<std::endl;        std::cout<<"setInfo:"<<std::endl;        for (std::vector<CWorkExprience>::iterator it=m_exset.begin(); it!=m_exset.end(); it++)        {                std::cout<<it->GetTime()<<"  "<<it->GetCompany()<<std::endl;        }        std::cout<<"set endl"<<std::endl;        std::cout<<"point test "<<*m_mon<< std::endl;            }    CResume* Clone()    {        return new CResume(*this);              //此处会调用构造函数    }private:    std::string m_resumename;    std::string m_name;    std::string m_sex;    //std::vector<>    CWorkExprience m_exprience;    std::vector<CWorkExprience> m_exset;        //集合 用于测试clone时 是深复制还是浅复制    int* m_mon;};#endif//客户端调用#include <iostream>#include <string>#include "Resume.h"#include "BaseClone.h"int main(void){       CResume* resume = new CResume();    resume->SetResumeName("zp resume");    resume->SetInfo("ZP", "BOY");    resume->AddWorkExprience("2014-2015", "GHCA");    resume->Add_set("1990-1995", "CHANGHONG");    resume->Add_set("1996-1999", "GUANZI");    resume->Add_set("2000-2003", "YILONG");    int* mon = new int(20);    resume->Set_mon(mon);    std::cout<<"Init info"<<std::endl;    resume->Display();    std::cout<<std::endl<<std::endl;    std::cout<<"light info"<<std::endl;    CResume* light = (CResume* )resume->Clone();    light->SetResumeName("Light Resume");    light->AddWorkExprience("2013-2014", "SIFANG");    light->Add_set("2004-2009", "LANGZHONG");    light->Add_set("2009-2012", "CHENGDU");    *mon = 30;    light->Set_mon(mon);    light->Display();    std::cout<<std::endl<<std::endl<<std::endl;     std::cout<<"zp info"<<std::endl;    resume->Display();    return 0;   }
0 0
原创粉丝点击