• 《大话设计模式》c++实现 原型模式


    意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    主要解决:在运行期建立和删除原型。

    何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。

    如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。

    使用场景: 1、资源优化场景。 2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。 3、性能和安全要求的场景。 4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。 5、一个对象多个修改者的场景。 6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。 7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用。

     

    浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有对其他对象的引用都仍然指向原来的对象。

    深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

    #include<iostream>
    #include<string>
    
    
    //WorkExperience类
    class WorkExprerience{
    private:
        std::string workDate;
        std::string company;
    public:
        WorkExprerience(){}
        ~WorkExprerience(){}
    
        WorkExprerience(WorkExprerience* work){
            this->workDate = work->workDate;
            this->company = work->company;
        }
        std::string getWorkDate(){
            return workDate;
        }
        void setWorkDate(std::string workDate){
            this->workDate = workDate;
        }
        std::string getCompany(){
            return company;
        }
        void setCompany(std::string company){
            this->company = company;
        }
    
        //clone
        WorkExprerience* Clone(){
            return new WorkExprerience(this);
        }
    };
    
    
    
    //原型类,声明一个克隆自身的接口。
    class Prototype{
    protected:
        std::string name;
        std::string sex;
        std::string age;
        std::string timeArea;
        std::string company;
    public:
        virtual void SetPersonalInfo(std::string sex, std::string age) = 0;
        virtual void Display() = 0;
        virtual Prototype* Clone() = 0;
    };
    
    //具体原型类,即ConcretePrototype类,本例中为简历Resume类,实现一个克隆自身的操作
    class Resume :public Prototype{
    private:
        WorkExprerience * workExp;
    public:
        Resume(std::string name){
            this->name = name;
            workExp = new WorkExprerience();
        }
        ~Resume(){
            if (workExp != NULL)
                delete workExp;
        }
        //克隆需要的构造函数
        Resume(WorkExprerience* workExp){
            this->workExp = workExp->Clone();
        }
        void SetPersonalInfo(std::string sex, std::string age){
            this->sex = sex;
            this->age = age;
        }
        void SetWorkExperience(std::string company,std::string workDate){
            workExp->setCompany(company);
            workExp->setWorkDate(workDate);
        }
        void Display(){
            std::cout << name << "  " << age<<" "<<sex << "  "  << std::endl;
            std::cout << "工作经历  " << workExp->getWorkDate() << "  " << workExp->getCompany() << std::endl;
        }
        Resume* Clone(){
            Resume* clonedResume = new Resume(workExp);
            clonedResume->name = this->name;
            clonedResume->sex = this->sex;
            return clonedResume;
        }
    };
    
    
    void main(){
        Resume* a = new Resume("big bird");
        a->SetPersonalInfo("MAN", "19");
        a->SetWorkExperience("1998-2000", "baidu");
    
        Resume* b = a->Clone();
        b->SetWorkExperience("2000-2008", "google");
    
        Resume* c = a->Clone();
        c->SetPersonalInfo("MAN", "24");
        c->SetWorkExperience("2000-2008", "apple");
    
    
        a->Display();
        b->Display();
        c->Display();
        system("pause");
    }

    参考:

    https://blog.csdn.net/xiqingnian/article/details/41983337

    http://www.runoob.com/design-pattern/prototype-pattern.html

  • 相关阅读:
    kafka官方的kafka-server-start.sh不能关闭kafka进程解决办法
    Linux如何切换图形界面和命令行界面
    2019-9-28:渗透测试,基础学习,DNS投毒
    2019-9-28:渗透测试,基础学习,pgp常量,逻辑运算,DNS投毒,笔记
    2019-9-10:渗透测试,基础学习,nmap扫描命令,php基本语法学习,笔记
    2019-9-11:渗透测试,Kill远控软件,初接触
    2019-9-27:渗透测试,metasploit-framework初接触
    2019-9-26:渗透测试,基础学习,js正则以及什么是目录扫描,笔记
    2019-9-26:渗透测试,基础学习,nmap扫描kali虚拟机服务
    2019-9-25:渗透测试,基础学习,Hydra BP爆破,js基本知识,banner信息收集笔记
  • 原文地址:https://www.cnblogs.com/zle1992/p/9852440.html
Copyright © 2020-2023  润新知