码迷,mamicode.com
首页 > 其他好文 > 详细

Charpter09 原型模式

时间:2020-03-18 13:52:28      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:ret   不用   this   pac   ring   code   隐藏   getc   prot   

原型模式简介

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

原型模式其实就是从一个对象再创建另外一个可定制的对象,并且不需知道任何创建的细节。

一般在初始化信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象的细节,有对性能是大大的提高。它等于是不用重新初始化对象,而是动态地获得对象运行时的状态。

所谓原型模式,其实就是在父类中定义一个clone的抽象方法,其目的是让子类来具体实现这个clone方法,此clone方法内实现对象创建以及字段的复制。注意只是类内字段复制,也就是浅copy。

所谓浅copy就是被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。而深copy则把引用的对象也copy了一份。

原型模式UML类图

技术图片

 

 

// 原型的接口类 Prototype
#ifndef _PROTOTYPE_HPP
#define _PROTOTYPE_HPP

class Prototype{
    public:
    virtual Prototype* clone()= 0;
    virtual void printVal() = 0;
};

#endif
// 抽象接口的实现类ConcretePrototype1
#ifndef _CONCRETEPROTOTYPE1_HPP
#define _CONCRETEPROTOTYPE1_HPP
#include<iostream>
#include<string>
#include"prototype.hpp"
using namespace std;

class ConcretePrototype1:public Prototype{
public:
    ConcretePrototype1()=default;
    ConcretePrototype1(double a, int b):a(a),b(b){}

    virtual Prototype* clone()override{
        ConcretePrototype1* clonedOne = new ConcretePrototype1();
        clonedOne->a = this->a;
        clonedOne->b = this->b;
        return (Prototype*)clonedOne;
    } 
    virtual void printVal()override{
        cout << "a:"<<a << endl;
        cout << "b:"<< b << endl;
    }
    void setA(double a){
        this->a = a;
    }
    void setB(int b){
        this->b = b;
    }
private:
    double a;
    int b; 
};
#endif
// 抽象接口的实现类ConcretePrototype2
#ifndef _CONCRETEPROTOTYPE2_HPP
#define _CONCRETEPROTOTYPE2_HPP
#include<iostream>
#include<string>
#include"prototype.hpp"
using namespace std;

class ConcretePrototype2:public Prototype{
public:
    ConcretePrototype2()=default;
    ConcretePrototype2(string str,double a):str(str),a(a){}
    virtual Prototype* clone()override{
        ConcretePrototype2* clonedOne = new ConcretePrototype2();
        clonedOne->str = this->str;
        clonedOne->a = this->a;
        return (Prototype*)clonedOne;
    } 
    virtual void printVal()override{
        cout << "str:"<<str<< endl;
        cout << "a:"<< a << endl;
    } 
    void setStr(string str){
        this->str = str;
    }
    void setA(double a){
        this->a = a;
    }
private:
    string str;
    double a; 
};
#endif
//客户端代码
#include<iostream>
#include"concreteprototype1.hpp"
#include"concreteprototype2.hpp"
using namespace std;
int main(){
    ConcretePrototype1 cp1(1,2);
    ConcretePrototype1* cp1Clone = (ConcretePrototype1*)cp1.clone();
    cp1.printVal();
    cp1Clone->printVal();

    ConcretePrototype2 cp2("aaa",3);
    ConcretePrototype2* cp2Clone =(ConcretePrototype2*)cp2.clone();
    cp2.printVal();
    cp2Clone->printVal();

    getchar();
    return 0;
}

 

 

Charpter09 原型模式

标签:ret   不用   this   pac   ring   code   隐藏   getc   prot   

原文地址:https://www.cnblogs.com/yb-blogs/p/12516629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!