1. 程式人生 > >設計模式-享元模式-C++實現

設計模式-享元模式-C++實現

享元模式:以共享的方式高效的支援大量的細粒度物件。通過複用記憶體中已存在的物件,降低系統建立物件例項的效能消耗。

享元模式關鍵是要區分外部狀態和內部狀態。

內部狀態:指的是物件本身的屬性,這些屬性不受外部環境影響。 外部狀態:指的是物件的這些屬性,收到外部環境的影響。

通過把物件的外部狀態和內部狀態分離出來,減少物件本身的儲存空間,外部狀態只有在執行的時候才會對物件產生影響。

#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;
}

執行結果: 在這裡插入圖片描述