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

            Just enjoy programming

            c++設計模式(八) 工廠模式:封裝對象的創建

                 工廠模式不允許將創建對象的代碼散布于整個系統。如果程序中所有需要創建對象的代碼都轉到這個工廠執行,那么在增加新對象時所要做的全部工作就是只需修改工廠。這種設計時眾所周知的工廠方法模式的一種變體。由于每個面向對象應用程序都需要創建對象,并且由于人們可能通過添加新類型來擴展應用程序,工廠模式可能是所有設計模式中最有用的模式之一。實現工廠模式的一種方法就是在基類中定義一個靜態成員函數,示例如下:
            #include<iostream>
            #include<stdexcept>
            #include<cstddef>
            #include<string>
            #include<vector>

            using namespace std;

            class Shape
            {
            public:
                virtual void draw()=0;
                virtual void erase()=0;
                virtual ~Shape(){}
                class BadShapeCreation :public logic_error
                {
                public:
                    BadShapeCreation(string type):
                        logic_error("Cannot create type"+type){}
                };
                static Shape* factory(const string &type)
                    throw(BadShapeCreation);
            };

            class Circle:public Shape
            {
                Circle(){}
                friend class Shape;
            public:
                void draw(){cout<<"Circle::draw"<<endl;}
                void erase(){cout<<"Circle::erase"<<endl;}
                ~Circle(){cout<<"Circle::~Circle"<<endl;}
            };

            class Square:public Shape
            {
                Square(){}
                friend class Shape;
            public:
                void draw(){cout<<"Square::draw"<<endl;}
                void erase(){cout<<"Square::erase"<<endl;}
                ~Square(){cout<<"Square::~Square"<<endl;}
            };

            Shape *Shape::factory(const string & type)
                throw(Shape::BadShapeCreation)
            {
                if(type=="Circle")return new Circle;
                if(type=="Square")return new Square;
                throw BadShapeCreation(type);
            }

            char *sl[]={"Circle","Square","Square","Circle","Circle","Circle","Square"};

            int main()
            {
                vector<Shape*>shapes;
                try{
                    for(size_t i=0;i<sizeof sl/sizeof sl[0];i++)
                        shapes.push_back(Shape::factory(sl[i]));
                }catch(Shape::BadShapeCreation e)
                {
                    cout<<e.what()<<endl;
                    return -1;
                }
                for(size_t i=0;i<shapes.size();i++)
                {
                    shapes[i]->draw();
                    shapes[i]->erase();
                }
            }

            函數factory 允許以一個參數來決定創建何種類型的Shape。在這里,參數類型為string,也可以是任何數據集。為了確保對象的創建只能發生在函數factory()中,Shape的特定類型的構造函數被設為私有,同時Shape被聲明為友元類,因此factory()能夠訪問這些構造函數。

            參考: C++編程思想卷2

            posted on 2011-05-03 23:12 周強 閱讀(1511) 評論(0)  編輯 收藏 引用 所屬分類: c/c++

            亚洲国产成人久久综合碰| 午夜精品久久影院蜜桃| 97精品伊人久久大香线蕉app| 久久这里只有精品18| 丁香久久婷婷国产午夜视频| 久久久国产打桩机| 精品久久久久久亚洲| 久久久久久亚洲精品影院| 无码人妻精品一区二区三区久久久 | 精品国产91久久久久久久| 无码任你躁久久久久久久| 久久国产精品无码HDAV| 久久久久人妻精品一区三寸蜜桃 | 久久91这里精品国产2020| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 国内精品伊人久久久久AV影院| 丰满少妇人妻久久久久久4| 亚洲综合伊人久久综合| 国产亚洲精久久久久久无码AV| 色偷偷久久一区二区三区| 怡红院日本一道日本久久| 久久久久久伊人高潮影院 | 久久亚洲日韩精品一区二区三区| 精品国产91久久久久久久a| 99久久久精品| 久久久久人妻精品一区二区三区| 国产成人综合久久精品红| 久久精品国产国产精品四凭| 精品精品国产自在久久高清 | 性做久久久久久久久久久| 香港aa三级久久三级| 国产精品无码久久久久久| 久久天堂AV综合合色蜜桃网| 久久99精品国产麻豆宅宅| 久久久久se色偷偷亚洲精品av | 热综合一本伊人久久精品| 91亚洲国产成人久久精品| 久久99热这里只有精品国产| A级毛片无码久久精品免费| 国产毛片久久久久久国产毛片 | 久久w5ww成w人免费|