创建型之原型模式C++实现

2022-06-16 15:06:16 浏览数 (2)

原型模式:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。

原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。

就像孙悟空拔下猴毛轻轻一吹就变出很多孙悟空一样简单。

原型模式包含:

  1. 抽象原型类:规定了具体原型对象必须实现的接口。
  2. 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  3. 访问类:使用具体原型类中的 clone() 方法来复制新的对象。

具体应用:学校奖状设计。

第一步:具体原型类

代码语言:javascript复制
class Info 
{  
    public:
        Info(){}
        string getDate(){return schooldate;}
        string getClass(){return schoolclass;}
        void setDate(string Date){schooldate=Date;}
        void setClass(string _class){schoolclass=_class;}
        
        //子类必须要实现所有父类的虚函数,子类才能实例化对象
        //奖学金原型克隆
       Info* Clone()
        {
            Info *info=new Info();
            *info=*this;
            return info;
        }
     private:
        string schooldate;
        string schoolclass;

};

第二步:抽象原型类

代码语言:javascript复制
//原型类,声明一个克隆自身的接口
class Certificate
{
    public:
       Certificate(){}
        virtual void Display()=0;
        virtual void SetInfo(string name,string sex,string college)=0;
        virtual void SetSchoolInfo(string data,string class_)=0;
        virtual Certificate* Clone()=0;
    protected:
        string name;
        string sex;
        string college;
};

第三步:访问接口

代码语言:javascript复制
class Citation:public Certificate
{
    public:
        
         Citation()=default;
        //对接口函数的额实现
         void SetInfo(string name,string sex,string college)
         {
              this->name=name;
            this->sex=sex;
            this->college=college;
        
         }

         void SetSchoolInfo(string data,string class_)
         {
             _info->setDate(data);
             _info->setClass(class_);
         }
        void Display()
        {
            cout<<name<<" "<<sex<<" "<<college<<"n";
            cout<< _info->getDate()<<" "<<_info->getClass()<<endl;
        }
        //克隆自身的接口实现
        Certificate* Clone()override
        {
            Citation *clonecitation=new Citation(_info);
            clonecitation->name=this->name;
            clonecitation->sex=this->sex;
            clonecitation->college=this->college;

            return clonecitation;
        }
    private:
         Info *_info=new Info();
        explicit Citation(Info *info):_info((Info*)info->Clone()){}
};

第四步:主函数

代码语言:javascript复制
#include "st.h"

int main()
{
    Citation *a = new Citation();
    a->SetInfo("王大大", "男", "机械学院");
    a->SetSchoolInfo("2020年第一学期", "荣获一等奖");
    a->Display();
 
    cout<<endl;
    //孙悟空拔侯毛
    Citation *b = (Citation*)a->Clone();
    b->SetInfo("李小小", "女", "文法学院");
    b->SetSchoolInfo("2019年第一学期", "荣获一等奖");
    b->Display();
    
    return 0;
}

结果显示:

0 人点赞