亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++設計模式之原型模式

2020-05-23 14:21:28
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式之原型模式,本文講解了什么是原型模式、為什么要使用原型模式、代碼實例等內容,需要的朋友可以參考下
 
 

C++設計模式之原型模式

什么是原型模式?

在GOF的《設計模式:可復用面向對象軟件的基礎》中是這樣說的:用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。這這個定義中,最重要的一個詞是“拷貝”,也就是口頭上的復制,而這個拷貝,也就是原型模式的精髓所在。

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

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

為什么要使用原型模式?

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

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

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

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

4.有的時候,創建對象時,構造函數的參數很多,而自己又不完全的知道每個參數的意義,就可以使用原型模式來創建一個新的對象,不必去理會創建的過程,讓創建過程見鬼去吧。
所以,在上述的的情況下,在設計的時候,適當的考慮一下原型模式,減少對應的工作量,減少程序的復雜度,提高效率。

用UML類圖表示原型模式

C++設計模式之原型模式

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

代碼實現

 

復制代碼代碼如下:

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

 

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

與其它創建型模式的比較

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

總結

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人两性免费视频| 91av在线国产| 亚洲精品自在久久| 久久久久久av| 日韩中文字幕国产| x99av成人免费| 亚洲国产成人精品电影| 性色av一区二区三区红粉影视| 欧美性视频网站| 91在线色戒在线| 2019中文字幕在线免费观看| 日韩最新中文字幕电影免费看| 91免费视频国产| 欧美黑人xxx| 国产欧美日韩视频| 久久免费视频在线| 欧美性猛交xxxx黑人猛交| 日韩中文字幕第一页| 亚洲男人天堂2023| 国产成人一区二区三区小说| 亚洲午夜精品久久久久久久久久久久| 欧美久久精品午夜青青大伊人| 91福利视频在线观看| 久久久久久国产精品美女| 中文字幕亚洲天堂| 蜜月aⅴ免费一区二区三区| 成人午夜高潮视频| 国产成人精品久久二区二区91| 欧美中文字幕在线观看| 一色桃子一区二区| 国产精品青草久久久久福利99| 国产精品久久久久久av福利| 欧美一级电影免费在线观看| 91香蕉亚洲精品| 国产+成+人+亚洲欧洲| 亚洲精品xxx| 亚洲一品av免费观看| 国产成人avxxxxx在线看| 日韩在线观看免费全| 热久久这里只有精品| 欧美精品18videosex性欧美| 91精品久久久久久综合乱菊| 午夜欧美大片免费观看| 欧美高清视频一区二区| 日韩动漫免费观看电视剧高清| 久久久精品视频在线观看| 自拍亚洲一区欧美另类| 日产日韩在线亚洲欧美| 国产va免费精品高清在线| 欧美日韩亚洲精品一区二区三区| 伊人久久五月天| 久久噜噜噜精品国产亚洲综合| 亚洲精品资源美女情侣酒店| 国内精品免费午夜毛片| 日本午夜在线亚洲.国产| 亚洲精品一区在线观看香蕉| 热久久视久久精品18亚洲精品| 18一19gay欧美视频网站| 欧美巨乳在线观看| 亚洲欧美国产日韩中文字幕| 日韩中文字幕网址| 欧美高清在线播放| 精品国产福利视频| 国产精品美女网站| 久久久欧美精品| 2019中文字幕在线观看| 少妇高潮久久久久久潘金莲| 久久久成人av| 精品国产91久久久久久| 国产91在线播放九色快色| 国产91|九色| 91av视频在线免费观看| 亚洲最大的免费| 国产亚洲视频在线观看| 国产综合在线观看视频| 欧美—级a级欧美特级ar全黄| 久久成年人免费电影| 色偷偷av一区二区三区| 亚洲片av在线| 欧美专区中文字幕| 日韩av免费一区| 少妇高潮久久久久久潘金莲| 成人国产精品日本在线| 欧美电影《睫毛膏》| 国产亚洲xxx| 欧美激情亚洲一区| 亚洲成人999| 成人h视频在线| 国产精品视频最多的网站| 欧美精品午夜视频| 亚洲国产另类 国产精品国产免费| 欧美疯狂性受xxxxx另类| 国外成人在线播放| 亚洲人成在线免费观看| 亚洲国产欧美自拍| 欧美亚洲免费电影| 日韩美女毛茸茸| 性欧美办公室18xxxxhd| 日韩在线观看免费全集电视剧网站| 夜夜嗨av色综合久久久综合网| 2024亚洲男人天堂| 亚洲老头同性xxxxx| 亚洲专区国产精品| 992tv在线成人免费观看| 亚洲一级黄色av| 国产精品视频播放| 欧美成人性生活| 国产日本欧美一区二区三区| 国产99久久精品一区二区永久免费| 日本精品久久久久久久| 亚洲国产精品热久久| 亚洲深夜福利网站| 福利一区福利二区微拍刺激| 色av吧综合网| 777国产偷窥盗摄精品视频| 国产精品成人在线| 国产亚洲日本欧美韩国| 日本精品久久中文字幕佐佐木| 亚洲全黄一级网站| 91干在线观看| 92看片淫黄大片欧美看国产片| 久久av中文字幕| 久久久成人精品视频| 亚洲国产日韩欧美综合久久| 亚洲香蕉成视频在线观看| 国产一区二区三区视频| 国产成人福利网站| 精品国产欧美成人夜夜嗨| 欧美成人免费播放| 国产va免费精品高清在线| 中文字幕日韩av综合精品| 日韩h在线观看| 国产精品美女网站| 久久国内精品一国内精品| 成人网页在线免费观看| 亚洲欧美在线播放| 国产视频精品va久久久久久| 国产在线视频一区| 亚洲人成电影在线| 日韩一区二区三区国产| 日本三级韩国三级久久| 高清一区二区三区四区五区| 国产欧美日韩中文字幕在线| 中文综合在线观看| 欧美激情亚洲一区| 亚洲精品久久久久久久久| 欧美刺激性大交免费视频| 高清欧美一区二区三区| 精品视频在线播放色网色视频| 97在线看免费观看视频在线观看| 在线精品播放av| 久久人91精品久久久久久不卡| 最好看的2019年中文视频| 久久精品影视伊人网| 国产精品第一区| 美女视频久久黄| 欧美午夜激情在线| 亚洲va男人天堂| 91中文在线视频| 国产精品久久婷婷六月丁香| 国产精品成人国产乱一区| 国产精品青青在线观看爽香蕉| 亚州av一区二区| 中文字幕亚洲专区|