設計模式C++實現(6)——建造者模式

分類: 軟件設計模式c++實現 46人閱讀 評論(0) 收藏 舉報
 軟件領域中的設計模式爲開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向對象編程語言的重要特性:封裝、繼承、多態,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》和《設計模式:可複用面向對象軟件的基礎》(DP)兩本書。本文介紹建造者模式的實現。

       建造者模式的定義將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示(DP)。《大話設計模式》舉了一個很好的例子——建造小人,一共需建造6個部分,頭部、身體、左右手、左右腳。與工廠模式不同,建造者模式是在導向者的控制下一步一步構造產品的。建造小人就是在控制下一步步構造出來的。創建者模式可以能更精細的控制構建過程,從而能更精細的控制所得產品的內部結構。下面給出建造者模式的UML圖,以建造小人爲實例。


          對於客戶來說,只需知道導向者就可以了,通過導向者,客戶就能構造複雜的對象,而不需要知道具體的構造過程。下面給出小人例子的代碼實現。

  1. class Builder    
  2. {  
  3. public:  
  4.     virtual void BuildHead() {}  
  5.     virtual void BuildBody() {}  
  6.     virtual void BuildLeftArm(){}  
  7.     virtual void BuildRightArm() {}  
  8.     virtual void BuildLeftLeg() {}  
  9.     virtual void BuildRightLeg() {}  
  10. };  
  11. //構造瘦人   
  12. class ThinBuilder : public Builder  
  13. {  
  14. public:  
  15.     void BuildHead() { cout<<"build thin body"<<endl; }  
  16.     void BuildBody() { cout<<"build thin head"<<endl; }  
  17.     void BuildLeftArm() { cout<<"build thin leftarm"<<endl; }  
  18.     void BuildRightArm() { cout<<"build thin rightarm"<<endl; }  
  19.     void BuildLeftLeg() { cout<<"build thin leftleg"<<endl; }  
  20.     void BuildRightLeg() { cout<<"build thin rightleg"<<endl; }  
  21. };  
  22. //構造胖人   
  23. class FatBuilder : public Builder  
  24. {  
  25. public:  
  26.     void BuildHead() { cout<<"build fat body"<<endl; }  
  27.     void BuildBody() { cout<<"build fat head"<<endl; }  
  28.     void BuildLeftArm() { cout<<"build fat leftarm"<<endl; }  
  29.     void BuildRightArm() { cout<<"build fat rightarm"<<endl; }  
  30.     void BuildLeftLeg() { cout<<"build fat leftleg"<<endl; }  
  31.     void BuildRightLeg() { cout<<"build fat rightleg"<<endl; }  
  32. };  
  33. //構造的指揮官   
  34. class Director    
  35. {  
  36. private:  
  37.     Builder *m_pBuilder;  
  38. public:  
  39.     Director(Builder *builder) { m_pBuilder = builder; }  
  40.     void Create(){  
  41.         m_pBuilder->BuildHead();  
  42.         m_pBuilder->BuildBody();  
  43.         m_pBuilder->BuildLeftArm();  
  44.         m_pBuilder->BuildRightArm();  
  45.         m_pBuilder->BuildLeftLeg();  
  46.         m_pBuilder->BuildRightLeg();  
  47.     }  
  48. };  
  1. class Builder    
  2. {  
  3. public:  
  4.     virtual void BuildHead() {}  
  5.     virtual void BuildBody() {}  
  6.     virtual void BuildLeftArm(){}  
  7.     virtual void BuildRightArm() {}  
  8.     virtual void BuildLeftLeg() {}  
  9.     virtual void BuildRightLeg() {}  
  10. };  
  11. //構造瘦人  
  12. class ThinBuilder : public Builder  
  13. {  
  14. public:  
  15.     void BuildHead() { cout<<"build thin body"<<endl; }  
  16.     void BuildBody() { cout<<"build thin head"<<endl; }  
  17.     void BuildLeftArm() { cout<<"build thin leftarm"<<endl; }  
  18.     void BuildRightArm() { cout<<"build thin rightarm"<<endl; }  
  19.     void BuildLeftLeg() { cout<<"build thin leftleg"<<endl; }  
  20.     void BuildRightLeg() { cout<<"build thin rightleg"<<endl; }  
  21. };  
  22. //構造胖人  
  23. class FatBuilder : public Builder  
  24. {  
  25. public:  
  26.     void BuildHead() { cout<<"build fat body"<<endl; }  
  27.     void BuildBody() { cout<<"build fat head"<<endl; }  
  28.     void BuildLeftArm() { cout<<"build fat leftarm"<<endl; }  
  29.     void BuildRightArm() { cout<<"build fat rightarm"<<endl; }  
  30.     void BuildLeftLeg() { cout<<"build fat leftleg"<<endl; }  
  31.     void BuildRightLeg() { cout<<"build fat rightleg"<<endl; }  
  32. };  
  33. //構造的指揮官  
  34. class Director    
  35. {  
  36. private:  
  37.     Builder *m_pBuilder;  
  38. public:  
  39.     Director(Builder *builder) { m_pBuilder = builder; }  
  40.     void Create(){  
  41.         m_pBuilder->BuildHead();  
  42.         m_pBuilder->BuildBody();  
  43.         m_pBuilder->BuildLeftArm();  
  44.         m_pBuilder->BuildRightArm();  
  45.         m_pBuilder->BuildLeftLeg();  
  46.         m_pBuilder->BuildRightLeg();  
  47.     }  
  48. };  

         客戶的使用方式:

  1. int main()  
  2. {  
  3.     FatBuilder thin;  
  4.     Director director(&thin);  
  5.     director.Create();  
  6.     return 0;  
  7. }  
  1. int main()  
  2. {  
  3.     FatBuilder thin;  
  4.     Director director(&thin);  
  5.     director.Create();  
  6.     return 0;  
  7. }  
        至此,《設計模式:可複用面向對象軟件的基礎》一書上的5種創建型模式介紹完了,分別是工廠方法模式、抽象工廠模式、原型模式、建造者模式、單例模式。

       設計模式C++實現(1)——工廠模式

     設計模式C++實現(4)——單例模式

       設計模式C++實現(5)——原型模式、模板方法模式 

       本人享有博客文章的版權,轉載請標明出處 http://blog.csdn.net/wuzhekai1985


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章