C++设计模式之享元模式

1. 设计目的

解决程序必须支持大量对象且没有足够的内存容量问题。

应用该模式所获的收益大小取决于使用它的方式和情景。 它在下列情况中最有效:

  • 程序需要生成数量巨大的相似对象
  • 这将耗尽目标设备的所有内存
  • 对象中包含可抽取且能在多个对象间共享的重复状态

实现原理:

  1. 将需要改写为享元的类成员变量拆分为两个部分:

         a) 内在状态: 包含不变的、 可在许多对象中重复使用的数据的成员变量。

          b) 外在状态: 包含每个对象各自不同的情景数据的成员变量。

  1. 保留类中表示内在状态的成员变量, 并将其属性设置为不可修改。 这些变量仅可在构造函数中获得初始数值。

  2. 找到所有使用外在状态成员变量的方法, 为在方法中所用的每个成员变量新建一个参数,并使用该参数代替成员变量。

  3. 你可以有选择地创建工厂类来管理享元缓存池, 它负责在新建享元时检查已有的享元。 如果选择使用工厂, 客户端就只能通过工厂来请求享元, 它们需要将享元的内在状态作为参数传递给工厂。

  4. 客户端必须存储和计算外在状态 (情景) 的数值, 因为只有这样才能调用享元对象的方法。 为了使用方便, 外在状态和引用享元的成员变量可以移动到单独的情景类中。

2. UML设计

3. 代码实现

代码实现见地址:https://github.com/luozichao324/Design-Patterns/tree/main/Flyweight/Flyweight

4. 总结

核心思想就是:将不常变的量抽象成一个对象(享元对象),这个对象用一些常变的量来操作(创建)成一个完整属性的对象。享元对象常和工厂方法模式联用。

如果程序中有很多相似对象, 那么你将可以节省大量内存。

你可能需要牺牲执行速度来换取内存,因为他人每次调用享元方法时都需要重新计算部分情景数据。

代码会变得更加复杂。

 

整篇文章参考:https://refactoringguru.cn/design-patterns/flyweight

 

未完待续(创建个对象池)。。。。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值