模式定义:运用共享技术有效地支持大梁细粒度的对象.
面向对象技术虽然好,但是在某些时候会带来内存上的开销.
举个常用的例子 -- visio软件
visio可以绘制很多图元,根据面向对象分析,可以把图元描述为下面的类
class CElement : public CObject
{
public:
CString m_strText;
Font m_font;
}
class Font
{
char m_name;
Color m_color;
int m_size;
}
一些操作函数就省略了,这里就提到了它会包含到的一些数据成员,其中m_strText表示绘制到各个图元上面的字符串,Font表示这个字符串的字体(visio一般不是这样设计,只是举例)
像这样的申明对象没有任何的问题,但是当这个对象很多的时候就会产生很大的内存开销,而且可以很明显的看出来Font的开销比原本的m_strText的开销大得多,但是这里Font也是对象必不可少的一个属性描述,那应该怎么办呢?
可以看出很多图元基本上的字体都是一样的,而且对于一个visio作品来说,用户也用不了多少种字体,所以这里就有了切入点.
可以利用一个表,或者是其它的能使存储的元素唯一的容器作为一个全局容器,里面存放的是Font的指针,当申明一个图元对象的时候,可以去检查这个Font的类型是否已经存在于当前的容器里面了,如果有就用容器里面的,如果没有就加到容器里面,这样就能尽可能少的使用内存了.
同样可以看出,其实m_strText也可以使用这样的方式,在windows系统中,也有这样类似的享元技术.
但是当产生的对象都不多,而且对象都不一样的时候,其实这个模式就没有太多的用处了.
所以一句话,居家过日子,能省就省,能公用的东西绝不另外花钱:)