• 原型模式


    一、简介

    1、原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

    2、为什么会用到原型模式?

    (1)既然可以直接new,为什么会用到原型模式?

    这个可以从两个角度来说,第一,时间消耗角度:如果创建实例的构造函数非常的复杂,在执行这个构造函数时会消耗较长的时间,这时如果需要一个跟刚刚实例化对象参数差不多的实例(可以完全相同,也可以大部分相同)那么直接使用 new 创建这样一个实例就显得太昂贵了,而如果使用原型模式克隆一个一模一样的实例(或者先克隆一个一模一样的实例,然后做小部分的改动)就显得非常的合理。第二,用户的修改麻烦程度角度,举个例子,假设要通过一个类实例化一各班同学的毕业信息,那么会有大量雷同的信息,这时如果要用new实例化,就需new很多次,更悲剧的是如果所有同学的信息都录入完毕,突然发现某个参数的信息录入错了,这时要对每一个实例分别进行修改,而如果使用原型模式克隆就不会出现这个问题。

    (2)既然类可以直接赋值,为什么会用到原型模式?

    因为类之间直接赋值的话,默认的拷贝函数是进行引用赋值的

    对于指针的浅复制会造糟糕的结果,这点可以参见C++ primer plus "类和动态内存分配"章节,也可以参见我的另一篇技术博客

    C++类的复制构造函数和赋值运算符 http://www.cnblogs.com/bewolf/p/4232079.html

    3、UML图

    4、所属类别:创建型

    二、原型模式的C++程序

     1 // 原型模式.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include<iostream>
     6 using namespace std;
     7 
     8 //声明一个虚拟基类,所有的原型都从这个基类继承,   
     9 class prototype  
    10 {  
    11 public:  
    12     prototype(){}  
    13     virtual ~prototype(){}  
    14     virtual prototype* clone() = 0;//纯虚函数,需要供继承者自行实现   
    15     //为了测试而添加的函数
    16     virtual void show()=0;
    17 }; 
    18 
    19 // 派生自Prototype,实现Clone方法 
    20 class concreateprototype  :public prototype
    21 {  
    22 public:  
    23     concreateprototype  (){}  
    24     concreateprototype  (const prototype&){}
    25     virtual ~concreateprototype (){}  
    26     virtual prototype* clone()
    27     {
    28         return new concreateprototype(*this);
    29     }
    30     //为了测试添加一个show函数
    31     void show()
    32     {
    33         cout<<"hello,i am a concreateprototype"<<endl;
    34     }
    35 };  
    36 
    37 //用户接口
    38 int _tmain(int argc, _TCHAR* argv[])
    39 {
    40     prototype  *people1=new concreateprototype();
    41     prototype  *people2=people1->clone();
    42     people2->show();
    43     return 0;
    44 }
  • 相关阅读:
    享受生命中的琐碎时光
    探秘无线路由高级选项 化解IP冲突
    企业无线路由器故障案例分析
    网络基础:无线网络技术规范
    optimize table 删除空洞MYSQL
    Python操作excel001(了解excel基本操作
    Python操作excel002(读取数据
    NopCommerce 自定义DataAnnotation DisplayAttribute
    asp.net mvc FluentValidation 的使用
    nopCommerce : Updating an existing entity. How to add a new property.
  • 原文地址:https://www.cnblogs.com/bewolf/p/4230230.html
Copyright © 2020-2023  润新知