【GeekBand】設(shè)計模式3

1.單件模式

1.1使用動機

必須保證一些特殊的類在系統(tǒng)中只有一個實例岭妖,以確保邏輯的正確性和效率函喉。比如數(shù)據(jù)層,網(wǎng)絡(luò)層锭汛。
繞過常規(guī)的構(gòu)造器笨奠,提供一種機制來保證一個類只有一個實例,以解決性能問題唤殴。(工廠模式繞過構(gòu)造器是要解決緊耦合的問題般婆。)
有必要只提供一個唯一的實例,不讓有“能生成多個實例”的機會朵逝。模式定義
保證一個類僅有一個實例蔚袍,并提供一個該實例的全局訪問點。--《設(shè)計模式》GoF結(jié)構(gòu)


單件模式

1.2要點總結(jié)

單件模式中的實例構(gòu)造器可以設(shè)置為protected以允許子類派生配名。
單件模式一般不要支持拷貝構(gòu)造函數(shù)和Clone接口啤咽,因為這有可能導(dǎo)致出現(xiàn)多個對象實例而有悖初衷
注意多線程環(huán)境下安全的單件模式,注意對雙檢查鎖的正確實現(xiàn)渠脉。

1.3 實現(xiàn)方法

class singleton  
{  
public:  
    ~singleton()  
    {//析構(gòu)時使用  
    }  
    static singleton* getInstance()  
    {  
        if(_instance == NULL)  
        {  
            _instance = new singleton();  
        }  
        return _instance;  
    }  
  
private:  
    static singleton *_instance;  
  
private:  
//最好將所有此類的實例化的進(jìn)口全部堵死  
    singleton()  
    {  
  
    }  
    singleton(const singleton&)  
    {  
  
    }  
    singleton& operator=(const singleton &)  
    {  
  
    }  
};  
singleton *singleton::_instance = NULL;  

2.享元模式

2.1 定義

(英語:Flyweight Pattern)是一種軟件設(shè)計模式宇整。它使用共享物件,用來盡可能減少內(nèi)存使用量以及分享資訊給盡可能多的相似物件芋膘;它適合用于只是因重復(fù)而導(dǎo)致使用無法令人接受的大量內(nèi)存的大量物件鳞青。通常物件中的部分狀態(tài)是可以分享霸饲。常見做法是把它們放在外部數(shù)據(jù)結(jié)構(gòu),當(dāng)需要使用時再將它們傳遞給享元臂拓。

2.2 使用場景

如果一個應(yīng)用程序使用了大量的對象厚脉,而這些對象造成了很大的存儲開銷的時候就可以考慮是否可以使用享元模式。
例如,如果發(fā)現(xiàn)某個對象的生成了大量的實例埃儿,并且這些實例除了幾個參數(shù)外基本是相同的器仗,如果把那些共享參數(shù)移到類外面,在方法調(diào)用時將他們傳遞進(jìn)來童番,就可以通過共享大幅度單個實例的數(shù)目精钮。

2.3 實現(xiàn)

class FontFactory{
private:
    map<string,Font* > fontPool;
    
public:
    Font* GetFont(const string& key){

        map<string,Font*>::iterator item=fontPool.find(key);
        
        if(item!=footPool.end()){
            return fontPool[key];
        }
        else{
            Font* font = new Font(key);
            fontPool[key]= font;
            return font;
        }

    }
    
    void clear(){
        //...
    }
};

3.狀態(tài)模式

3.1 定義

當(dāng)一個對象的內(nèi)在狀態(tài)改變時允許改變其行為,這個對象看起來像是改變了其類剃斧。
狀態(tài)模式主要解決的是當(dāng)控制一個對象狀態(tài)的條件表達(dá)式過于復(fù)雜時的情況轨香。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同狀態(tài)的一系列類中,可以把復(fù)雜的判斷邏輯簡化幼东。

3.2 適用 場景

1.一個對象的行為取決于它的狀態(tài)臂容,并且它必須在運行時刻根據(jù)狀態(tài)改變它的行為。
2.一個操作中含有龐大的多分支結(jié)構(gòu)根蟹,并且這些分支決定于對象的狀態(tài)脓杉。

3.3 實現(xiàn)

class NetworkState{

public:
    NetworkState* pNext;
    virtual void Operation1()=0;
    virtual void Operation2()=0;
    virtual void Operation3()=0;

    virtual ~NetworkState(){}
};


class OpenState :public NetworkState{
    
    static NetworkState* m_instance;
public:
    static NetworkState* getInstance(){
        if (m_instance == nullptr) {
            m_instance = new OpenState();
        }
        return m_instance;
    }

    void Operation1(){
        
        //**********
        pNext = CloseState::getInstance();
    }
    
    void Operation2(){
        
        //..........
        pNext = ConnectState::getInstance();
    }
    
    void Operation3(){
        
        //$$$$$$$$$$
        pNext = OpenState::getInstance();
    }
    
    
};

class CloseState:public NetworkState{ }
//...


class NetworkProcessor{
    
    NetworkState* pState;
    
public:
    
    NetworkProcessor(NetworkState* pState){
        
        this->pState = pState;
    }
    
    void Operation1(){
        //...
        pState->Operation1();
        pState = pState->pNext;
        //...
    }
    
    void Operation2(){
        //...
        pState->Operation2();
        pState = pState->pNext;
        //...
    }
    
    void Operation3(){
        //...
        pState->Operation3();
        pState = pState->pNext;
        //...
    }

};


4.組合模式

4.1 定義

將對象組合成樹形結(jié)構(gòu)以表示“部分整體”的層次結(jié)構(gòu)。組合模式使得用戶對單個對象和組合對象的使用具有一致性简逮。

4.2 適用場景

以下情況下適用Composite模式:
1.你想表示對象的部分-整體層次結(jié)構(gòu)
2.你希望用戶忽略組合對象與單個對象的不同球散,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對象。

4.3 實現(xiàn)

#include <iostream>
#include <list>
#include <string>
#include <algorithm>

using namespace std;

class Component
{
public:
    virtual void process() = 0;
    virtual ~Component(){}
};

class Composite : public Component{
    
    string name;
    list<Component*> elements;
public:
    Composite(const string & s) : name(s) {}
    
    void add(Component* element) {
        elements.push_back(element);
    }
    void remove(Component* element){
        elements.remove(element);
    }
    
    void process(){
        
        //1. process current node
        
        
        //2. process leaf nodes
        for (auto &e : elements)
            e->process(); 
         
    }
};


class Leaf : public Component{
    string name;
public:
    Leaf(string s) : name(s) {}
            
    void process(){
        //process current node
    }
};


void Invoke(Component & c){
    //...
    c.process();
    //...
}


int main()
{

    Composite root("root");
    Composite treeNode1("treeNode1");
    Composite treeNode2("treeNode2");
    Composite treeNode3("treeNode3");
    Composite treeNode4("treeNode4");
    Leaf leat1("left1");
    Leaf leat2("left2");
    
    root.add(&treeNode1);
    treeNode1.add(&treeNode2);
    treeNode2.add(&leaf1);
    
    root.add(&treeNode3);
    treeNode3.add(&treeNode4);
    treeNode4.add(&leaf2);
    
    process(root);
    process(leaf2);
    process(treeNode3);
  
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末散庶,一起剝皮案震驚了整個濱河市蕉堰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悲龟,老刑警劉巖屋讶,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異须教,居然都是意外死亡皿渗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門轻腺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乐疆,“玉大人,你說我怎么就攤上這事约计【魇茫” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵煤蚌,是天一觀的道長耕挨。 經(jīng)常有香客問我细卧,道長,這世上最難降的妖魔是什么筒占? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任贪庙,我火速辦了婚禮,結(jié)果婚禮上翰苫,老公的妹妹穿的比我還像新娘止邮。我一直安慰自己,他們只是感情好奏窑,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布导披。 她就那樣靜靜地躺著,像睡著了一般埃唯。 火紅的嫁衣襯著肌膚如雪撩匕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天墨叛,我揣著相機與錄音止毕,去河邊找鬼。 笑死漠趁,一個胖子當(dāng)著我的面吹牛扁凛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闯传,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼谨朝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丸边?” 一聲冷哼從身側(cè)響起叠必,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤荚孵,失蹤者是張志新(化名)和其女友劉穎妹窖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體收叶,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡骄呼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了判没。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜓萄。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖澄峰,靈堂內(nèi)的尸體忽然破棺而出嫉沽,到底是詐尸還是另有隱情,我是刑警寧澤俏竞,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布绸硕,位于F島的核電站堂竟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏玻佩。R本人自食惡果不足惜出嘹,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咬崔。 院中可真熱鬧税稼,春花似錦、人聲如沸垮斯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兜蠕。三九已至丸升,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牺氨,已是汗流浹背狡耻。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猴凹,地道東北人夷狰。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像郊霎,于是被迫代替她去往敵國和親沼头。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理书劝,服務(wù)發(fā)現(xiàn)进倍,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 設(shè)計模式匯總 一购对、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用猾昆、多...
    MinoyJet閱讀 3,922評論 1 15
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,934評論 6 13
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法骡苞,內(nèi)部類的語法垂蜗,繼承相關(guān)的語法,異常的語法解幽,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • 文/圖囿 “王岜贴见,你給我聽著,我厭煩了一天和你至少煲兩小時的電話粥躲株,你丫以后有話想跟我說...
    圖囿閱讀 1,013評論 7 15