zoukankan      html  css  js  c++  java
  • 原型模式(Prototype)

           Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有原型一样的数据。

                1) 由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
                2) 目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅是与原型对象具有相同的结构,还与原型对象有相同的值。

                3) 根据对象克隆深度层次的不同,有浅度克隆和深度克隆。

          
           Prototype模式也正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝也是面试的重点之一。
            
                
                                                                         2-1Prototype Pattern结构图
     
           Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的实现语言相关,在C++中我们将通过拷贝构造函数实现之。
     应用场景:
             “某些结构复杂的对象”   的创建工作,由于需求的变化,这些对象经常面临着巨大的变化,但是它们却拥有比较稳定一致的接口。    一个复杂对象具有自我复制功能,同一一套接口。
           代码如下:
               
    #include <iostream>
    using namespace std;
    
    class Pro
    {
    public:
    	virtual Pro* clone() = 0;
    	virtual void print() = 0;
    };
    
    class CPlusPlusPro : public Pro
    {	
    public:
    	CPlusPlusPro(string name, string job) 
    	{
    		m_job = job;
    		m_name = name;
    	}
    	CPlusPlusPro(CPlusPlusPro &cpp)
    	{
    		m_name = cpp.m_name;
    		m_job = cpp.m_job;
    	}
    
    	virtual void print() 
    	{
    		cout << m_name << " : " << m_job << endl;
    	}
    
    	virtual Pro* clone()
    	{
    		return new CPlusPlusPro(*this);
    	}
    
    public:
    	string m_name;
    	string m_job;
    };
    
    int main()
    {
    	CPlusPlusPro *tmp = new CPlusPlusPro("tom", "engineer");
    	tmp->print();
    
    	Pro *cpp = tmp->clone();
    	cpp->print();
    
    	delete cpp;
    	delete tmp;
    	return 0;
    }
    

      

       
    总结:
            Prototype模式通过复制原型(Prototype)而获得新对象创建的功能,这里Prototype本身就是“对象工厂”(因为能够生产对象),实际上Prototype模式和Builder模式、AbstractFactory模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是:Builder模式重在复杂对象的一步步创建(并不直接返回对象),<span data-wiz-span="data-wiz-span" style="font-family: 'Times New Roman'; font-size: 1rem;">C9E8BCC6C4A3CABDBEABBDE2A3AD476F46203233D6D6C9E8BCC6C4A3CABDBDE2CEF6B8BD432B2BCAB5CFD6D4B4C2EBC9E8</span>AbstractFactory模式重在产生多个相互依赖类的对象,而Prototype模式重在从自身复制自己创建新类。

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

  • 相关阅读:
    linux date使用
    SHELL输出带颜色字体
    vimrc配置
    你所不知道的C++
    temp
    说什么好呢3
    Extjs3 Combo实现百度搜索查询
    Extjs3笔记 fbar
    Extjs combo赋值与刷新的先后顺序
    sql中nvarchar(max)长度测试
  • 原文地址:https://www.cnblogs.com/enumhack/p/7472777.html
Copyright © 2011-2022 走看看