4,原型模式(Prototype Pattern)实际上就是动态抽取当前对象运行时的状态。
Posted 杜东洲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4,原型模式(Prototype Pattern)实际上就是动态抽取当前对象运行时的状态。相关的知识,希望对你有一定的参考价值。
原型模式(Prototype Pattern) 实际上就是动态抽取当前对象运行时的状态。
Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型一样的数据。
1)由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
2)目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。
3)根据对象克隆深度层次的不同,有浅度克隆与深度克隆。
适用情况: 一个复杂对象,具有自我复制功能,统一一套接口。 对于对象比较复杂,每创建一次new 都会浪费好多的资源和时间 且在初始化的信息不发生变化的前提下 克隆是最好的办法,
隐藏了对象创建细节,对性能大大提高。
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <iostream> 3 using namespace std; 4 #include "string" 5 6 //人虚父类 虚的克隆函数 7 class Person 8 { 9 public: 10 virtual Person* clone() = 0; 11 virtual void printT() = 0; 12 }; 13 //CPP程序员 子类 14 class CPlusPlusProgrammer : public Person 15 { 16 public: 17 CPlusPlusProgrammer() 18 { 19 m_name = ""; 20 m_age = 0; 21 m_resume = NULL; 22 setResume("aaaa"); 23 } 24 CPlusPlusProgrammer(string name, int age) 25 { 26 m_name = name; 27 m_age = age; 28 m_resume = NULL; 29 setResume("aaaa"); 30 } 31 void setResume(char *p) 32 { 33 if (m_resume != NULL) 34 { 35 delete m_resume; 36 } 37 m_resume = new char[strlen(p) + 1]; 38 strcpy(m_resume, p); 39 } 40 41 42 virtual void printT() 43 { 44 cout << "m_name" << m_name << " m_age" << m_age << "m_resume:" << m_resume << endl; 45 } 46 virtual Person* clone() 47 { 48 CPlusPlusProgrammer *tmp = new CPlusPlusProgrammer; 49 //tmp->m_name = this->m_name; 50 *tmp = *this; // = 浅拷贝 copy前后两个m_resume指针 指向了同一个内存 51 return tmp; //如何修改为深入的copy 就是新开辟空间 把指针内容复制进去就行了 没有 52 } 53 protected: 54 private: 55 string m_name; 56 int m_age ; 57 char *m_resume; 58 59 }; 60 61 void main() 62 { 63 Person *c1 = new CPlusPlusProgrammer("张三", 32); 64 c1->printT(); 65 66 67 Person *c2 = c1->clone(); 68 c2->printT(); 69 70 cout<<"hello..."<<endl; 71 system("pause"); 72 return ; 73 }
这个也是不错的::::【http://blog.csdn.net/lcl_data/article/details/8764228】
以上是关于4,原型模式(Prototype Pattern)实际上就是动态抽取当前对象运行时的状态。的主要内容,如果未能解决你的问题,请参考以下文章
二十四种设计模式:原型模式(Prototype Pattern)