• <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国产精一区二区三区| 九九热久久免费视频| 无码任你躁久久久久久老妇App| 久久精品国产亚洲AV麻豆网站| 狠狠精品久久久无码中文字幕 | 久久久久久亚洲Av无码精品专口| 91精品国产91久久久久久| 中文字幕无码久久精品青草| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 午夜精品久久久久久久无码| 久久久无码人妻精品无码| 国产精品无码久久综合网| 亚洲愉拍99热成人精品热久久 | 久久99热这里只有精品国产| 国产AV影片久久久久久| 亚洲AV无码久久精品成人 | 国产69精品久久久久久人妻精品| 国产福利电影一区二区三区久久久久成人精品综合 | 久久九九免费高清视频| 精品国产乱码久久久久久郑州公司| 欧美精品一区二区久久| 品成人欧美大片久久国产欧美...| 国产精品一区二区久久不卡| 久久天天躁狠狠躁夜夜2020一 | 久久精品国产福利国产琪琪| 99久久精品毛片免费播放| 香蕉久久夜色精品升级完成 | 国内精品九九久久久精品| 伊人久久综合精品无码AV专区| 久久久久久久91精品免费观看| 久久久亚洲精品蜜桃臀| 久久影视综合亚洲| 久久有码中文字幕| 亚洲午夜福利精品久久| 亚洲精品无码久久久| 无码任你躁久久久久久老妇App| 久久只这里是精品66|