亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

什么是原型模式?

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

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

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

為什么要使用原型模式?

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

1.當(dāng)我們的對(duì)象類(lèi)型不是開(kāi)始就能確定的,而這個(gè)類(lèi)型是在運(yùn)行期確定的話(huà),那么我們通過(guò)這個(gè)類(lèi)型的對(duì)象克隆出一個(gè)新的對(duì)象比較容易一些;

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

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

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

用UML類(lèi)圖表示原型模式

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

代碼實(shí)現(xiàn)

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

/*
** FileName     : PrototypePatternDemo
** Author       : Jelly Young
** Date         : 2013/11/25
** Description  : More information, please go to http://chabaoo.cn
*/
 
#include <iostream>
using namespace std;
 
//接口
class Prototype
{
public :
    Prototype(){}
    virtual ~Prototype(){}
 
    virtual Prototype * Clone() = 0;
};
 
//實(shí)現(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)
{
    //生成對(duì)像
    ConcretePrototype * conProA = new ConcretePrototype ();
 
    //復(fù)制自身
    ConcretePrototype * conProB = conProA->Clone();
 
    delete conProA;
    conProA= NULL ;
 
    delete conProB;
    conProB= NULL ;
 
    return 0;
}

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

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

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

總結(jié)

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

相關(guān)文章

  • C++中的菱形繼承深入分析

    C++中的菱形繼承深入分析

    這篇文章主要介紹了C++中的菱形繼承深入分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++使用easyX庫(kù)實(shí)現(xiàn)三星環(huán)繞效果流程詳解

    C++使用easyX庫(kù)實(shí)現(xiàn)三星環(huán)繞效果流程詳解

    EasyX是針對(duì)C/C++的圖形庫(kù),可以幫助使用C/C++語(yǔ)言的程序員快速上手圖形和游戲編程。這篇文章主要介紹了C++使用easyX庫(kù)實(shí)現(xiàn)三星環(huán)繞效果,需要的可以參考一下
    2022-10-10
  • C++浮點(diǎn)型的存儲(chǔ)方式詳解

    C++浮點(diǎn)型的存儲(chǔ)方式詳解

    本篇文章是對(duì)C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下,希望能夠給你帶來(lái)幫助
    2021-09-09
  • C 程序?qū)崿F(xiàn)密碼隱秘輸入的實(shí)例 linux系統(tǒng)可執(zhí)行

    C 程序?qū)崿F(xiàn)密碼隱秘輸入的實(shí)例 linux系統(tǒng)可執(zhí)行

    下面小編就為大家?guī)?lái)一篇C 程序?qū)崿F(xiàn)密碼隱秘輸入的實(shí)例 linux系統(tǒng)可執(zhí)行。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • linux下c語(yǔ)言的多線程編程

    linux下c語(yǔ)言的多線程編程

    這篇文章主要介紹了linux下c語(yǔ)言的多線程編程,需要的朋友可以參考下
    2017-10-10
  • c++遍歷lua table示例

    c++遍歷lua table示例

    這篇文章主要介紹了c++遍歷lua table示例,需要的朋友可以參考下
    2014-04-04
  • C語(yǔ)言動(dòng)態(tài)規(guī)劃之背包問(wèn)題詳解

    C語(yǔ)言動(dòng)態(tài)規(guī)劃之背包問(wèn)題詳解

    這篇文章主要介紹了C語(yǔ)言動(dòng)態(tài)規(guī)劃之背包問(wèn)題詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 詳解C++中的數(shù)據(jù)抽象

    詳解C++中的數(shù)據(jù)抽象

    這篇文章主要介紹了詳解C++中的數(shù)據(jù)抽象,數(shù)據(jù)抽象是指,只向外界提供關(guān)鍵信息,并隱藏其后臺(tái)的實(shí)現(xiàn)細(xì)節(jié),即只表現(xiàn)必要的信息而不呈現(xiàn)細(xì)節(jié),需要的朋友可以參考下
    2023-05-05
  • 詳解C語(yǔ)言中的動(dòng)態(tài)內(nèi)存管理

    詳解C語(yǔ)言中的動(dòng)態(tài)內(nèi)存管理

    對(duì)于數(shù)據(jù)的存儲(chǔ)我們可以靜態(tài)存儲(chǔ),也可以動(dòng)態(tài)存儲(chǔ),兩種方式都有自己特有的好處,這篇文章教我們?nèi)绾瓦M(jìn)行動(dòng)態(tài)的數(shù)據(jù)存儲(chǔ)?。。。「信d趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12
  • C++的函數(shù)與指針

    C++的函數(shù)與指針

    今天小編就為大家分享一篇關(guān)于C++函數(shù)與指針的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2021-10-10

最新評(píng)論