zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    e.printStackTrace()打印在哪里以及如何e.printStackTrace()的内容打印在日志中
    oracle分组并在组内排序
    Java.util.Calendar类
    oracle分页查询
    两个map合并
    【自动化测试】无需图形界面环境下的浏览器开源项目
    【运维工具】logrotate 日志管理神器
    如何查看google chrome 插件源码
    phpexcel 读取数据
    常用开发资源收集
  • 原文地址:https://www.cnblogs.com/D-DZDD/p/7338505.html
Copyright © 2011-2022 走看看