• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數據加載中……

            設計模式之Builder模式

            Builder模式和Factory模式的區別是:Builder模式是分步創建對象。在此模型中有個director類,通過它來把切片stream傳遞給builder,通過切片來創建對象。此中模式把部件組合成完整的產品和部件的實現分開,從而實現通過共同的接口的不同實現創建產品。
            #include <iostream>
            #include <string>
            #include <vector>
            #include <cstddef>
            #include ".../purge.h"
            using std::size_t;

            class BicyclePart{
            public:
               enum BPart{FRAME,WHEEL,SEAT,DERAILLEUR,HANDLERBAR,SPROCKET,RACK,SHOCK,NPARTS};
            private:
               BPart id;
               static std::string names[NPARTS];
            public:
               BicyclePart(BPart bp) {id=bp;}
               friend std::ostream& operator<<(std::ostream& os,const BicyclePart& pb){
                  return os<<bp.names[bp.id];}
            };

            class Bicycle{
               std::vector<BicyclePart*> parts;
            public:
               ~Bicycle() {pruge(parts);}
               void addParts(BicyclePart* bp){parts.push_back(bp);}
               friend std::ostream& operator<<(std::ostream& os,const Bicycle& b){
                  os<<"{";
                  for(size_t i= 0; i < b.parts.size();++i)
                     os<<*b.parts[i]<<' ';
                  return os <<"}";}
            };

            class BicycleBuilder{
            protected:
               Bicycle* product;
            public:
               BicycleBuilder(){product = 0;}
               void CreateProcuct(){product = new Bicycle;}
               virtual void buildFrame()=0;
               virtual void buildWheel()=0;
               virtual void buildSeat()=0;
               virtual void buildDerailleur()=0;
               virtual void buildHandlebar()=0;
               virtual void buildSprocket()=0;
               virtual void buildRack()=0;
               virtual void buildShocK()=0;
               virtual std::string getBikeName() const =0;
               Bicycle* getProduct(){
                  Bicycle* temp= product;
                  product = 0; //Relinquish product
                  return temp;}
            };

            class  MountainBikeBuilder:public BicycleBuilder{
            public:
               void buildFrame();
               void buildWheel();
               void buildSeat();
               void buildDerailleur();
               void buildHandlebar();
               void buildSprocket();
               void buildRack();
               void buildShocK();
               std::string getBikeName() const {return "MountainBike"}
            };

            class  TouringBikeBuilder:public BicycleBuilder{
            public:
               void buildFrame();
               void buildWheel();
               void buildSeat();
               void buildDerailleur();
               void buildHandlebar();
               void buildSprocket();
               void buildRack();
               void buildShocK();
               std::string getBikeName() const {return "TouringBike"}
            };

            class RacingBickBuilder:public BicycleBuilder{
            public:
               void buildFrame();
               void buildWheel();
               void buildSeat();
               void buildDerailleur();
               void buildHandlebar();
               void buildSprocket();
               void buildRack();
               void buildShock();
               std::string getBickName()const {return "RacingBike";}
            };

            class BicycleTechnician{
               BicycleBuilder* builder;
            public:
               BicycleTechnician(){builder=0;}
               void setBuilder(BicycleBuiler* b) {builder=b;}
               void construct();
            };

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            std::string BicyclePart::names[NPARTS] ={"Frame","Wheel","Seat","Derailleur","Handlebar","Sprocket","Rack","Shock"};

            //MountainBikeBuilder implementation
            void MountainBikeBuilder::buildFrame(){product->addpart(new BicyclePart(Bicycle::FRAME));}
            void MountainBikeBuilder::buildWheel(){product->addpart(new BicyclePart(Bicycle::WHEEL));}
            void MountainBikeBuilder::buildSeat(){product->addpart(new BicyclePart(Bicycle::SEAT));}
            void MountainBikeBuilder::buildDerailleur(){product->addpart(new BicyclePart(Bicycle::DERAILLEUR));}
            void MountainBikeBuilder::buildHandlebar(){product->addpart(new BicyclePart(Bicycle::HANDLEBAR));}
            void MountainBikeBuilder::buildSprocket(){product->addpart(new BicyclePart(Bicycle::SPROCKET));}
            void MountainBikeBuilder::buildRack(){}
            void MountainBikeBuilder::buildShock(){product->addpart(new BicyclePart(Bicycle::SHOCK));}
               
            //TouringBikeBuilder implementation
            void TouringBikeBllider::buildFrame(){product->addpart(new BicyclePart(Bicycle::FRAME));}
            void TouringBikeBuilder::buildWheel(){product->addpart(new BicyclePart(Bicycle::WHEEL));}
            void TouringBikeBuilder::buildSeat(){product->addpart(new BicyclePart(Bicycle::SEAT));}
            void TouringBikeBuilder::buildDerailleur(){product->addpart(new BicyclePart(Bicycle::DERAILLEUR}
            void TouringBikeBuilder::buildHandlebar(){product->addpart(new BicyclePart(Bicycle::HANDLEBAR));}
            void TouringBikeBuilder::buildSprocket(){product->addpart(new BicyclePart(Bicycle::SPROCKET));}
            void TouringBikeBuilder::buildRack(){product->addpart(new BicyclePart(Bicycle::RACK));}
            void TouringBikeBuilder::buildShock(){}

            //RacingBikeBulider implementation
            void RacingBikeBuilder::buildFrame(){product->addpart(new BicyclePart(Bicycle::FRAME));}
            void RacingBikeBuilder::buildWheel(){product->addpart(new BicyclePart(Bicycle::WHEEL));}
            void RacingBikeBuilder::buildSeat(){product->addpart(new BicyclePart(Bicycle::SEAT));}
            void RacingBikeBuilder::buildDerailleur(){}
            void RacingBikeBuilder::buildHandlebar(){product->addpart(new BicyclePart(Bicycle::HANDLEBAR));}
            void RacingBikeBuilder::buildSprocket(){product->addpart(new BicyclePart(Bicycle::SPROCKET));}
            void RacingBikeBuilder::buildRack(){}
            void RacingBikeBuilder::buildShock(){}

            //BicycleTechnician implementation
            void BicycleTechnician::construct(){
               assert(builder);
               builder->createProduct();
               builder->buildFrame();
               builder->buildWheel();
               builder->buildSeat();
               builder->buildDerailleur();
               builder->buildHandlbar();
               builder->buildSprocket();
               builder->buildRack();
               builder->buildShock();
            };

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            #include <cstddef>
            #include <iostream>
            #include <map>
            #include <vector>
            #inculde "../purge.h"
            using namespace std;

            //constructs a bike via a concrete builder
            Bicycle* buildMeBike(BicycleTechnician& t,BicycleBuilder* builder){
               t.setBuilder(builder);
               t.construct();
               Bicycle* b = builder->getProduct();
               cout<<"Build a"<<builder->getBikeName()<<endl;
               return b;
            }

            int main(){
               //Create an order for some bicycle
               map<string,size_t> order;
               order["mountain"] = 2;
               order["toruing"] = 1;
               order["racing"] = 3;

               //build bikes
               vector<Bicycle*> bikes;
               BicycleBuilder* m = new MountainBikeBuilder;
               BicycleBuilder* t = new TouringBikeBuilder;
               BicycleBuilder* r = new RacingBikeBuilder;
               BicycleTechnician tech;
               map<string,size_t> ::iterator it = order.begin();
               while(it != order.end()){
                  BicycleBuilder* builder;
                  if(it->first == "Mountain")
                     builder = m;
                  else if(it->first == "touring")
                     builder = t;
                  else if(it->first == "racing")
                     builder = r;
                  for(size_t i=0; i < it->second; ++i)
                     bikes.push_back(builderMeABike(tech,builder));
                  ++ it;
               }
               delete m;
               delete t;
               delete r;
               
               //Display inventory
               for(size_t i = 0; i < bikes.size(); ++i)
                  cout<<"Bicycle" <<*bikes[i] <<endl;
               pruge(bikes);
            }

            posted on 2009-04-23 22:34 Benjamin 閱讀(403) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            久久久99精品成人片中文字幕| 久久久久国产精品三级网| 少妇无套内谢久久久久| 影音先锋女人AV鲁色资源网久久 | 伊人久久精品无码av一区| 久久久无码精品亚洲日韩蜜臀浪潮 | 精品蜜臀久久久久99网站| 91精品国产色综久久| 久久午夜福利无码1000合集| 国产成人综合久久综合| 久久艹国产| 久久国产高清字幕中文| 一本大道久久香蕉成人网| 欧美精品一区二区精品久久| 日韩欧美亚洲综合久久影院Ds| A狠狠久久蜜臀婷色中文网| 亚洲精品美女久久久久99小说| 久久精品人人槡人妻人人玩AV| 久久久久无码中| 久久国产精品久久久| 久久亚洲精品成人av无码网站| 看全色黄大色大片免费久久久| 久久精品国产秦先生| 国产V亚洲V天堂无码久久久| 亚洲综合久久久| 午夜精品久久久内射近拍高清| 国产成人久久精品二区三区| 精品久久久久久国产91| 久久久无码精品亚洲日韩按摩| 久久久久亚洲av成人网人人软件 | 热久久视久久精品18| 国产一区二区精品久久凹凸| 狠狠色丁香久久综合五月| 久久水蜜桃亚洲av无码精品麻豆| 久久久久久亚洲精品影院| 久久亚洲国产成人影院| 久久久久久久波多野结衣高潮| 久久人与动人物a级毛片| 无码任你躁久久久久久老妇App| 婷婷久久综合| 亚洲va久久久噜噜噜久久男同 |