设计模式(8)--flyweight 享元模式

flyweight意为轻量,但是用在设计模式的翻译中变成了享元。这个单词名字确实不好取。这两个意思,其实都能表达该模式的意义。
flyweight模式,实际上的目的就是控制对象的数目。我们已经见识过很多控制对象数目的方法,例如池化,单例,缓存,常量表等等。
这里写图片描述
flyweight主要是通过将共性的行为和状态共享,来达到控制对象的目的,现在即可以明白轻量和享元这两个词的意思了。
flyweight模式的要点:
1.会使用工厂,控制对象最典型的方式便是工厂模式,提供了强大的灵活的低耦合的对象创建方式。
2.需要抽取共性的行为和状态,形成接口类型。而不是共性的状态,则应该分离出去,可以作为参数传递给共享的对象。
3.使用flyweight会造成计算上的额外开销,但是当控制对象数目得到的效果理想时,就值得考虑。

举例说明:一个war3对战双方都是兽族,都只出大G(Grunt,兽族步兵)。那么战场上一共最多会有100个大G。设想这个游戏会池化50个大G,一个大G生产出来,引擎会给这个大G分配一个对象,等大G战死,引擎回收对象,下一个大G生产出来,收回的对象可以分配给这个新生产的大G继续使用。
把问题深入一步,对战双方,大G的颜色不一样啊。那么玩家1的大G对象在收回后可以被玩家2使用么?如果步行,那么即使玩家1的大G死了,还是不能分配给玩家2,游戏中的大G对象就有增加的可能。—-问题很好解决,两边除了颜色不一样,其它完全一样好么。那么显然,我们应该把颜色抽取独立出来,而大G其它的共性行为状态,就成为了共享对象。引擎只需要在分配的时候加入颜色这个独立状态即可。这就是flyweight模式的用法。

再举一例:想象现在dota2的服务器,在2016年2月即宣布20多亿局游戏,字段长度不够用了要扩容。可见同一时间有多少局游戏在打响。那么商店物品,是不是应该用flyweight,而把比赛ID作为独立状态分离出去?这样的话,像圣剑这种出现几率相对很低的道具,在不买出的情况下,根本不需要分配出去,游戏结束后有圣剑的游戏局就可以收回。通过flyweight,可以大大减少在海量游戏局里的对象数。

总结:嘿嘿,这两个例子都是自己的脑补情节((⊙o⊙)!),虽然未必符合实际但是想必能够解释flyweight模式的意义。缓存,池化的方式有很多,像String.intern()而flyweight特指那种有共性却也有个性的对象使用情况,因此特别将之明确为一种模式。 另外再多说一句:String.intern()可以去找出已存在的字符串常量。但如果是new String(“123”)则不管”123”存在与否,都可以会新创建一个对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值