GEEKBAND 設(shè)計模式第二周

對象創(chuàng)建模式

  • 通過對象創(chuàng)建模式繞開NEW弄屡,來避免對象創(chuàng)建(new)過程中所導致的緊耦合(依賴具體類)题禀,從而支持對象創(chuàng)建的穩(wěn)定。它是接口抽象之后的第一步工作膀捷。

工廠模式

  • 為了提高內(nèi)聚和松耦合迈嘹,我們經(jīng)常會抽象出一些類的公共接口以形成抽象基類或者接口。這樣我們可以通過聲明一個指向基類的指針來指向?qū)嶋H的子類實現(xiàn)全庸,達到了多態(tài)的目的秀仲。
  • 很容易出現(xiàn)一個問題N多的子類繼承自父類抽象基類,我們不得不在每次要用到子類的地方就編寫諸如new的代碼
  • 工廠模式兩個重要功能:1)定義創(chuàng)建對象的接口 2)使得具體化類的工作延遲到了子類中
class ISplitter{
public:
    virtual void split()=0;
    virtual ~ISplitter(){}
};


//宸ュ巶鍩虹被
class SplitterFactory{
public:
    virtual ISplitter* CreateSplitter()=0;
    virtual ~SplitterFactory(){}
};
class BinarySplitter : public ISplitter{
    
};

class TxtSplitter: public ISplitter{
    
};

class PictureSplitter: public ISplitter{
    
};

class VideoSplitter: public ISplitter{
    
};

//具體工廠
class BinarySplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new BinarySplitter();
    }
};

class TxtSplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new TxtSplitter();
    }
};

class PictureSplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new PictureSplitter();
    }
};

class VideoSplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new VideoSplitter();
    }
};
 class MainForm : public Form

{

         SplitterFactory* factory;//工廠

              public:

                      MainForm(SplitterFactory* factory){ //利用傳入?yún)?shù)來決定用什么文件分割器壶笼,這就把"變化"的范圍限制在MainForm之外了

                    this->factory=factory;

  }



                   void Button1_Click(){

                  ISplitter * splitter=

                    factory->CreateSplitter(); //創(chuàng)造性的做出了一個多態(tài)的new

               splitter->split();

              }

         };
  • Factory 模式在實際開發(fā)中應(yīng)用非常廣泛神僵,面向?qū)ο蟮南到y(tǒng)經(jīng)常面臨著對象創(chuàng)建問題:要創(chuàng)建的類實在是太多了。而 Factory 提供的創(chuàng)建對象的接口封裝(第一個功能)覆劈, 以及其將類的實例化推遲到子類(第二個功能) 都部分地解決了實際問題保礼。 一個簡單的例子就是筆者開開發(fā) VisualCMCS 系統(tǒng)的語義分析過程中沛励, 由于要為文法中的每個非終結(jié)符構(gòu)造一個類處理,因此這個過程中對象的創(chuàng)建非常多炮障,采用 Factory 模式后系統(tǒng)可讀性性和維護都變得elegant 許多

抽象模式

  • AbstractFactory 模式就是用來解決這類問題的:要創(chuàng)建一組相關(guān)或者相互依賴的對象目派。
  • AbstractFactory 模式關(guān)鍵就是將這一組對象的創(chuàng)建封裝到一個用于創(chuàng)建對象的類( ConcreteFactory)中, 維護這樣一個創(chuàng)建類總比維護 n 多相關(guān)對象的創(chuàng)建過程要簡單的多胁赢。

//數(shù)據(jù)庫訪問有關(guān)的基類址貌。面向接口編程 
class IDBConnection{
    
};
class IDBConnectionFactory{
public:
    virtual IDBConnection* CreateDBConnection()=0;
};


class IDBCommand{
    
};
class IDBCommandFactory{
public:
    virtual IDBCommand* CreateDBCommand()=0;
};


class IDataReader{
    
};
class IDataReaderFactory{
public:
    virtual IDataReader* CreateDataReader()=0;
};


//支持SQL Server
class SqlConnection: public IDBConnection{
    
};
class SqlConnectionFactory:public IDBConnectionFactory{
    
};


class SqlCommand: public IDBCommand{
    
};
class SqlCommandFactory:public IDBCommandFactory{
    
};


class SqlDataReader: public IDataReader{
    
};
class SqlDataReaderFactory:public IDataReaderFactory{
    
};

//支持Oracle
class OracleConnection: public IDBConnection{
    
};

class OracleCommand: public IDBCommand{
    
};

class OracleDataReader: public IDataReader{
    
};



class EmployeeDAO{
    IDBConnectionFactory* dbConnectionFactory;
    IDBCommandFactory* dbCommandFactory;
    IDataReaderFactory* dataReaderFactory;
    
    
public:
    vector<EmployeeDO> GetEmployees(){
        IDBConnection* connection =
            dbConnectionFactory->CreateDBConnection();
        connection->ConnectionString("...");

        IDBCommand* command =
            dbCommandFactory->CreateDBCommand();
        command->CommandText("...");
        command->SetConnection(connection); //關(guān)聯(lián)性

        IDBDataReader* reader = command->ExecuteReader(); //關(guān)聯(lián)性
        while (reader->Read()){

        }

    }
};
  • AbstractFactory 模式是為創(chuàng)建一組( 有多類) 相關(guān)或依賴的對象提供創(chuàng)建接口, 而 Factory 模式正如我在相應(yīng)的文檔中分析的是為一類對象提供創(chuàng)建接口或延遲對象的創(chuàng)建到子類中實現(xiàn)
  • AbstractFactory 模式通常都是使用 Factory 模式實現(xiàn)

接口隔離模式

原型模式

  • 工廠模式 和原型模式解決的問題都是一樣的徘键,繞開new。不同點:原型模式解決更復雜的中間方法遍蟋,工廠模式解決幾步就可以解決的問題
  • 使用一個原型實例指定創(chuàng)建對象的種類吹害,通過復制這個原型創(chuàng)建對象。

  • 仍然考慮文件分割器虚青,我們類比工廠方法它呀。原型模式是一種特殊的創(chuàng)建,通過克掳衾濉(復制構(gòu)造)來進行創(chuàng)建纵穿。

         class MainForm : public Form
    
           {
    
                     ISplitter* prototype;//
      public:
    
                       MainForm(ISplitter* prototype){
    
                   this->prototype=prototype; //讓原型對象指向傳過來的原型
    
         }
    
                 void Button1_Click(){
    
                  ISplitter * splitter=
    
                prototype->clone(); //克隆原型
    
                     splitter->split();
    
                }
    
             };
    

建構(gòu)器

(不常用)

  • 將一個復雜對象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示

門面模式

  • 為子系統(tǒng)的一組接口提供一個一致的界面奢人,門面模式定義了一個高層接口谓媒,這個接口使得這一子系統(tǒng)更加容易使用(復用)

代理模式

  • 為其他對象提供一種代理以控制對這個對象的訪問
              class ISubject{
public:
    virtual void process();
};


//Proxy的設(shè)計

class SubjectProxy: public ISubject{

public:

virtual void process(){

//對RealSubject的一種間接訪問,可以添加一些操作

//....

}

};

class ClientApp{
    
    ISubject* subject;
    
public:
    
    ClientApp(){
        subject=new SubjectProxy();
    }
    
    void DoTask(){
        //...
        subject->process();
        
        //....
    }
};






適配器

  • 將一個類的接口轉(zhuǎn)換成客戶希望的另一個接口何乎。使原本不兼容的可以一起工作
      //目標接口(新接口)

class ITarget{

public:

virtual void process()=0;

};

 

//遺留接口(老接口)

class IAdaptee{

public:

virtual void foo(int data)=0;

virtual int bar()=0;

};

 

//遺留類型

class OldClass: public IAdaptee{

//....

};
//對象適配器

class Adapter: public ITarget{ //繼承

protected:

IAdaptee* pAdaptee;//組合

 

public:

 

Adapter(IAdaptee* pAdaptee){

this->pAdaptee=pAdaptee;

}

 

virtual void process(){

int data=pAdaptee->bar();

pAdaptee->foo(data);

 

}

};


//類適配器

class Adapter: public ITarget,

protected OldClass{ //多繼承

 

}


int main(){
    IAdaptee* pAdaptee=new OldClass();
    
    
    ITarget* pTarget=new Adapter(pAdaptee);
    pTarget->process();
    
    
}


class stack{
    deqeue container;
    
};

class queue{
    deqeue container;
    
};

    







中介者

  • 用一個中介對象來封裝一系列的對象交互句惯。中介者使各對象不需要顯式的相互引用,從而使其耦合松散支救,而且可以獨立改變他們之間的交互
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抢野,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子各墨,更是在濱河造成了極大的恐慌指孤,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贬堵,死亡現(xiàn)場離奇詭異恃轩,居然都是意外死亡,警方通過查閱死者的電腦和手機扁瓢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門详恼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人引几,你說我怎么就攤上這事昧互⊥焯” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵敞掘,是天一觀的道長叽掘。 經(jīng)常有香客問我,道長玖雁,這世上最難降的妖魔是什么更扁? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮赫冬,結(jié)果婚禮上浓镜,老公的妹妹穿的比我還像新娘。我一直安慰自己劲厌,他們只是感情好膛薛,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著补鼻,像睡著了一般哄啄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上风范,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天咨跌,我揣著相機與錄音,去河邊找鬼硼婿。 笑死锌半,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的寇漫。 我是一名探鬼主播拳喻,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猪腕!你這毒婦竟也來了冗澈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陋葡,失蹤者是張志新(化名)和其女友劉穎亚亲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腐缤,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡捌归,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岭粤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惜索。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖剃浇,靈堂內(nèi)的尸體忽然破棺而出巾兆,到底是詐尸還是另有隱情猎物,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布角塑,位于F島的核電站蔫磨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏圃伶。R本人自食惡果不足惜堤如,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窒朋。 院中可真熱鬧搀罢,春花似錦畔咧、人聲如沸崔赌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聚假,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杰标。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留彩匕,地道東北人腔剂。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像驼仪,于是被迫代替她去往敵國和親掸犬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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

  • 設(shè)計模式匯總 一绪爸、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復使用湾碎、多...
    MinoyJet閱讀 3,944評論 1 15
  • 設(shè)計模式基本原則 開放-封閉原則(OCP),是說軟件實體(類奠货、模塊介褥、函數(shù)等等)應(yīng)該可以拓展,但是不可修改递惋。開-閉原...
    西山薄涼閱讀 3,798評論 3 14
  • 一柔滔、設(shè)計模式的分類 總體來說設(shè)計模式分為三大類: 創(chuàng)建型模式,共五種:工廠方法模式萍虽、抽象工廠模式睛廊、單例模式、建造者...
    RamboLI閱讀 749評論 0 1
  • 原文鏈接:http://blog.csdn.net/zhangerqing http://www.cnblogs....
    孤獨雜貨鋪閱讀 1,516評論 0 3
  • 上周講述了DOF設(shè)計模式中的“組件協(xié)作”模式(包括template method模式杉编、strategy策略模式超全、o...
    cayhw閱讀 253評論 0 0