最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++設(shè)計模式之原型模式

 更新時間:2014年09月30日 15:16:18   投稿:junjie  
這篇文章主要介紹了C++設(shè)計模式之原型模式,本文講解了什么是原型模式、為什么要使用原型模式、代碼實例等內(nèi)容,需要的朋友可以參考下

什么是原型模式?

在GOF的《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》中是這樣說的:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。這這個定義中,最重要的一個詞是“拷貝”,也就是口頭上的復(fù)制,而這個拷貝,也就是原型模式的精髓所在。

舉一個最簡單的例子來說明原型模式:記得上小學(xué)的時候,老師把需要做的課外習(xí)題寫到黑板上,而下面的我們都要把這些題抄寫到自己的本子上,回家做好,第二天交上來,也就是每道題,全班50個人,每個人都要抄寫一遍。按照現(xiàn)在的時間理論來說,就是浪費了50個人的時間。但是,那個時候條件限制,老師也是不得已而為之?,F(xiàn)在好了,老師做一份電子版的習(xí)題,打印一份,然后拿著這份打印的原版,就可以復(fù)制出50份。

結(jié)合原型模式的概念進行分析,老師打印出來的那一份,就是“原型”,而復(fù)制出來的那50份,就是使用的“拷貝”。而原型模式就是這么簡單的一個道理,通過現(xiàn)有的東西,再復(fù)制出一個來。

為什么要使用原型模式?

原型模式和建造者模式、工廠方法模式一樣,都屬于創(chuàng)建型模式的一種。簡單的來說,我們使用原型模式,就是為了創(chuàng)建對象。但是,在以下場景下,使用原型模式是最好的選擇:

1.當我們的對象類型不是開始就能確定的,而這個類型是在運行期確定的話,那么我們通過這個類型的對象克隆出一個新的對象比較容易一些;

2.有的時候,我們需要一個對象在某個狀態(tài)下的副本,此時,我們使用原型模式是最好的選擇;例如:一個對象,經(jīng)過一段處理之后,其內(nèi)部的狀態(tài)發(fā)生了變化;這個時候,我們需要一個這個狀態(tài)的副本,如果直接new一個新的對象的話,但是它的狀態(tài)是不對的,此時,可以使用原型模式,將原來的對象拷貝一個出來,這個對象就和之前的對象是完全一致的了;

3.當我們處理一些比較簡單的對象時,并且對象之間的區(qū)別很小,可能就幾個屬性不同而已,那么就可以使用原型模式來完成,省去了創(chuàng)建對象時的麻煩了;

4.有的時候,創(chuàng)建對象時,構(gòu)造函數(shù)的參數(shù)很多,而自己又不完全的知道每個參數(shù)的意義,就可以使用原型模式來創(chuàng)建一個新的對象,不必去理會創(chuàng)建的過程,讓創(chuàng)建過程見鬼去吧。
所以,在上述的的情況下,在設(shè)計的時候,適當?shù)目紤]一下原型模式,減少對應(yīng)的工作量,減少程序的復(fù)雜度,提高效率。

用UML類圖表示原型模式

由于克隆需要一個原型,而上面的類圖中Prototype就這個原型,Prototype定義了克隆自身的Clone接口,由派生類進行實現(xiàn),而實現(xiàn)原型模式的重點就在于這個Clone接口的實現(xiàn)。ConcretePrototype1類和ConcretePrototype2類繼承自Prototype類,并實現(xiàn)Clone接口,實現(xiàn)克隆自身的操作;同時,在ConcretePrototype1類和ConcretePrototype2類中需要重寫默認的復(fù)制構(gòu)造函數(shù),供Clone函數(shù)調(diào)用,Clone就是通過在內(nèi)部調(diào)用重寫的復(fù)制構(gòu)造函數(shù)實現(xiàn)的。在后續(xù)的編碼過程中,如果某個類需要實現(xiàn)Clone功能,就只需要繼承Prototype類,然后重寫自己的默認復(fù)制構(gòu)造函數(shù)就好了。好比在C#中就提供了ICloneable接口,當某個類需要實現(xiàn)原型模式時,只需要實現(xiàn)這個接口的道理是一樣的。

代碼實現(xiàn)

復(fù)制代碼 代碼如下:

/*
** FileName     : PrototypePatternDemo
** Author       : Jelly Young
** Date         : 2013/11/25
** Description  : More information, please go to http://m.fzitv.net
*/
 
#include <iostream>
using namespace std;
 
//接口
class Prototype
{
public :
    Prototype(){}
    virtual ~Prototype(){}
 
    virtual Prototype * Clone() = 0;
};
 
//實現(xiàn)
class ConcretePrototype : public Prototype
{
public :
    ConcretePrototype():m_counter(0){}
    virtual ~ConcretePrototype(){}
 
    //拷貝構(gòu)造函數(shù)
    ConcretePrototype( const ConcretePrototype & rhs)
    {
        m_counter = rhs .m_counter;
    }
 
    //復(fù)制自身
    virtual ConcretePrototype * Clone()
    {
        //調(diào)用拷貝構(gòu)造函數(shù)
        return new ConcretePrototype (*this );
    }
 
private :
    int m_counter;
};
 
int main(int argc , char **argv)
{
    //生成對像
    ConcretePrototype * conProA = new ConcretePrototype ();
 
    //復(fù)制自身
    ConcretePrototype * conProB = conProA->Clone();
 
    delete conProA;
    conProA= NULL ;
 
    delete conProB;
    conProB= NULL ;
 
    return 0;
}

上述代碼實現(xiàn)了一個最簡單的原型模式,但是已經(jīng)將原型模式的基本實現(xiàn)原理展現(xiàn)出來了。而有的時候,當調(diào)用Clone獲得了一個復(fù)制的對象以后,需要改變對象的狀態(tài),此時就可能需要在ConcretePrototype類中添加一個Initialize操作,專門用于初始化克隆對象。由于在Clone的內(nèi)部調(diào)用的是復(fù)制構(gòu)造函數(shù),而此處又涉及到深復(fù)制和淺復(fù)制的問題。所以,在實際操作的過程中,這些問題,都需要進行仔細的考慮。

與其它創(chuàng)建型模式的比較

工廠方法模式、抽象工廠模式、建造者模式和原型模式都是創(chuàng)建型模式。工廠方法模式適用于生產(chǎn)較復(fù)雜,一個工廠生產(chǎn)單一的一種產(chǎn)品的時候;抽象工廠模式適用于一個工廠生產(chǎn)多個相互依賴的產(chǎn)品;建造者模式著重于復(fù)雜對象的一步一步創(chuàng)建,組裝產(chǎn)品的過程,并在創(chuàng)建的過程中,可以控制每一個簡單對象的創(chuàng)建;原型模式則更強調(diào)的是從自身復(fù)制自己,創(chuàng)建要給和自己一模一樣的對象。

總結(jié)

原型模式作為創(chuàng)建型模式中最特殊的一個模式,具體的創(chuàng)建過程,是由對象本身提供,這樣我們在很多的場景下可以很方便的快速的構(gòu)建新的對象。但是,原型模式的最大缺點是繼承原型的子類都要實現(xiàn)Clone操作,這個是很困難的。例如,當所考慮的類已經(jīng)存在時就難以新增Clone操作。當內(nèi)部包括一些不支持拷貝或者有循環(huán)引用的對象時,實現(xiàn)克隆可能也會很困難。說以說,每一種設(shè)計模式都有它的優(yōu)點和缺點,在設(shè)計的時候,我們需要進行權(quán)衡各方面的因素,揚長避短。

相關(guān)文章

  • 關(guān)于STL中的map容器的一些總結(jié)

    關(guān)于STL中的map容器的一些總結(jié)

    對于map的學(xué)習(xí),或者說是對STL中的容器的學(xué)習(xí),要知道每種容器的實現(xiàn)原理,每種適合適合解決什么問題的,才是關(guān)鍵
    2013-09-09
  • Jsoncpp的安裝與使用方式

    Jsoncpp的安裝與使用方式

    JsonCpp是一個用于解析和生成JSON數(shù)據(jù)的C++庫,它支持解析JSON文件或字符串到C++對象,以及將C++對象序列化回JSON格式,安裝JsonCpp可以通過命令安裝,默認安裝動態(tài)庫,JsonCpp的使用主要涉及三個類:Json::Value用于表示JSON值
    2025-01-01
  • C語言圖書管理系統(tǒng)實驗

    C語言圖書管理系統(tǒng)實驗

    這篇文章主要為大家詳細介紹了C語言圖書管理系統(tǒng)實驗,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • c++傳遞函數(shù)指針和bind的示例

    c++傳遞函數(shù)指針和bind的示例

    這篇文章主要介紹了c++傳遞函數(shù)指針和bind的示例,需要的朋友可以參考下
    2014-05-05
  • C/C++動態(tài)分配與釋放內(nèi)存的區(qū)別詳細解析

    C/C++動態(tài)分配與釋放內(nèi)存的區(qū)別詳細解析

    以下是對C與C++中動態(tài)分配與釋放內(nèi)存的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • C語言多功能動態(tài)通訊錄實現(xiàn)示例

    C語言多功能動態(tài)通訊錄實現(xiàn)示例

    這篇文章主要為大家介紹了C語言多功能動態(tài)通訊錄實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • C++使用map容器實現(xiàn)電子詞典

    C++使用map容器實現(xiàn)電子詞典

    這篇文章主要為大家詳細介紹了C++如何使用map容器實現(xiàn)電子詞典功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的小伙伴可以參考一下
    2022-11-11
  • C語言如何輸出中文

    C語言如何輸出中文

    這篇文章主要介紹了C語言如何輸出中文問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • C語言實現(xiàn)學(xué)生成績等級劃分的方法實例

    C語言實現(xiàn)學(xué)生成績等級劃分的方法實例

    這篇文章主要給大家介紹了關(guān)于C語言實現(xiàn)學(xué)生成績等級劃分的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C語言猜兇手的代碼實現(xiàn)

    C語言猜兇手的代碼實現(xiàn)

    本文主要介紹了C語言猜兇手的代碼實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論

富宁县| 平安县| 新和县| 和政县| 堆龙德庆县| 炉霍县| 台南市| 奈曼旗| 涡阳县| 上思县| 曲水县| 尼木县| 大足县| 商城县| 云阳县| 芦溪县| 牙克石市| 盘锦市| 车致| 本溪市| 隆林| 台安县| 图们市| 寿光市| 七台河市| 苏尼特右旗| 调兵山市| 华池县| 南靖县| 克拉玛依市| 宁都县| 隆德县| 民乐县| 巨野县| 永安市| 朝阳区| 九江市| 双流县| 鄂温| 木兰县| 齐河县|