zoukankan      html  css  js  c++  java
  • 《大话设计模式》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

  • 相关阅读:
    Hanoi塔
    采药
    进制转换(大数)
    Load Balancing with NGINX 负载均衡算法
    upstream模块实现反向代理的功能
    epoll
    在nginx启动后,如果我们要操作nginx,要怎么做呢 别增加无谓的上下文切换 异步非阻塞的方式来处理请求 worker的个数为cpu的核数 红黑树
    粘性会话 session affinity sticky session requests from the same client to be passed to the same server in a group of servers
    负载均衡 4层协议 7层协议
    A Secure Cookie Protocol 安全cookie协议 配置服务器Cookie
  • 原文地址:https://www.cnblogs.com/zle1992/p/9852440.html
Copyright © 2011-2022 走看看