意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
主要解决:在运行期建立和删除原型。
何时使用: 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