享元模式:以共享的方式高效的支持大量的细粒度对象。通过复用内存中已存在的对象,降低系统创建对象实例的性能消耗。
享元模式关键是要区分外部状态和内部状态。
内部状态:指的是对象本身的属性,这些属性不受外部环境影响。
外部状态:指的是对象的这些属性,收到外部环境的影响。
通过把对象的外部状态和内部状态分离出来,减少对象本身的存储空间,外部状态只有在运行的时候才会对对象产生影响。
#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;
}
运行结果: