設計模式-享元模式-C++實現
阿新 • • 發佈:2018-12-19
享元模式:以共享的方式高效的支援大量的細粒度物件。通過複用記憶體中已存在的物件,降低系統建立物件例項的效能消耗。
享元模式關鍵是要區分外部狀態和內部狀態。
內部狀態:指的是物件本身的屬性,這些屬性不受外部環境影響。 外部狀態:指的是物件的這些屬性,收到外部環境的影響。
通過把物件的外部狀態和內部狀態分離出來,減少物件本身的儲存空間,外部狀態只有在執行的時候才會對物件產生影響。
#include <stdio.h> #include <string> #include <vector> //繪製圓心在原點的圓,半徑、顏色可以設定 class MyCircle { public: virtual void drawCircle(int r,std::string clr) = 0; int getID() { return _id; } void setID(int id) { _id = id; } protected: int _id; }; class BigCircle : public MyCircle { public: void drawCircle(int r, std::string clr) { printf("在圓心的位置繪製了一個半徑為%d,顏色為%s的大圓\n", r,clr.c_str()); } }; class SmallCircle : public MyCircle { public: void drawCircle(int r, std::string clr) { printf("在圓心的位置繪製了一個半徑為%d,顏色為%s的小圓\n", r, clr.c_str()); } }; class CircleFactroy { public: MyCircle* getCircle(int id) { int num = _circleList.size(); for(int i = 0; i < num;i++) { MyCircle* aCircle = _circleList.at(i); if(id == aCircle->getID()) { return aCircle; } } MyCircle* one = new BigCircle; one->setID(id); _circleList.push_back(one); return one; } private: std::vector<MyCircle*>_circleList; }; int main() { CircleFactroy* factroy = new CircleFactroy; MyCircle* one = factroy->getCircle(1); one->drawCircle(10, "紅色"); MyCircle* two = factroy->getCircle(2); two->drawCircle(20, "黃色"); return 0; }
執行結果: