• <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

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 398, 文章 - 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 閱讀(409) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            国产欧美久久久精品| 久久久国产精品| 伊人久久久AV老熟妇色| 日韩人妻无码一区二区三区久久 | 热re99久久精品国99热| 久久中文娱乐网| 久久精品国产免费观看| 日本一区精品久久久久影院| 亚洲欧洲精品成人久久曰影片| 午夜天堂精品久久久久| 精品一久久香蕉国产线看播放| 久久毛片一区二区| 99久久精品国产一区二区蜜芽| 伊人久久大香线蕉AV色婷婷色 | 国产精品久久久久一区二区三区| 久久人人爽人人人人片av| 精品久久一区二区三区| 18岁日韩内射颜射午夜久久成人| 国产精品VIDEOSSEX久久发布| 久久午夜无码鲁丝片| 中文字幕精品久久久久人妻| 99久久综合国产精品二区| 精品久久久久久久无码 | 精品久久久久久无码专区不卡| 久久精品桃花综合| 欧美精品丝袜久久久中文字幕| 婷婷伊人久久大香线蕉AV| 久久久无码精品亚洲日韩京东传媒| 精品国产91久久久久久久a| 99久久99久久精品免费看蜜桃 | 亚洲AⅤ优女AV综合久久久| 韩国三级中文字幕hd久久精品| 久久国产成人精品麻豆| 久久精品99久久香蕉国产色戒| 亚洲成色WWW久久网站| 婷婷久久久亚洲欧洲日产国码AV| 久久久午夜精品福利内容| 亚洲国产成人精品91久久久| 午夜精品久久久久| 一本一本久久a久久综合精品蜜桃| 久久精品国产日本波多野结衣|