居家过日子,能省就省-----FlyWeight享元模式

 

模式定义:运用共享技术有效地支持大梁细粒度的对象.

面向对象技术虽然好,但是在某些时候会带来内存上的开销.

举个常用的例子 -- 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系统中,也有这样类似的享元技术.

但是当产生的对象都不多,而且对象都不一样的时候,其实这个模式就没有太多的用处了.

 

所以一句话,居家过日子,能省就省,能公用的东西绝不另外花钱:)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值