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

posted @ 2017-08-10 11:50  杜东洲  阅读(274)  评论(0编辑  收藏  举报