标签:ret 不用 this pac ring code 隐藏 getc prot
原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式其实就是从一个对象再创建另外一个可定制的对象,并且不需知道任何创建的细节。
一般在初始化信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象的细节,有对性能是大大的提高。它等于是不用重新初始化对象,而是动态地获得对象运行时的状态。
所谓原型模式,其实就是在父类中定义一个clone的抽象方法,其目的是让子类来具体实现这个clone方法,此clone方法内实现对象创建以及字段的复制。注意只是类内字段复制,也就是浅copy。
所谓浅copy就是被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。而深copy则把引用的对象也copy了一份。
// 原型的接口类 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; }
标签:ret 不用 this pac ring code 隐藏 getc prot
原文地址:https://www.cnblogs.com/yb-blogs/p/12516629.html