recycle设计模式的使用

Recycle设计模式主要用于对象池管理,通过调用recycle()方法将对象隐藏避免系统回收,先clear()重置对象状态。obtain()方法通常从对象池获取,池满时可能创建新对象。这种模式旨在节省频繁创建对象的时间,实现空间换时间,适合临时使用且需求量稳定的对象。合理的对象池容量应与系统常规状态下所需对象数量匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概括一下:调用recycle()不是为让系统去回收这个对象,而是让对象池(所以类中要有一个对象池静态成员,如:SynchronizedPool<VelocityTracker> sPool)回收这个对象(就是做了隐藏该对象,避免被系统回收的机制),在调用recycle()前需要调用clear(),用于将对象重置到初始化状态。得到这类对象一般通过obtain方法获取,obtain()0一般会从对象池中获取,当对象池的对象都被使用时,若没超多最大容量,则再创建放入对象池中,并返回,若已超过最大容量则就不知道会怎样处理。这是一个类似线程池的设计,但目的有点不一样,对象池是为了让经常被使用,但使用时间不长,避免经常要创建对象重新分配的时候使用的,可以节省时间,这是一个空间换时间的设计,对象池不能太大,否则占内存太多。对象池最合理的容量是,保持在常规状态下,系统用到这类对象的数目大小值即可,这样才能最合理的利用空间,最大的时间获取率(用最小的空间获取更多的时间)。

使用recycle的类保持了一个链表,作为对象池,以一个静态对象作为表头。下面的类的设计是使用完调用recycle就是将对象插入链表头部,如果要对象,就调用obtain从链表头中取。

 
  1. /**
  2. * Created by Tiou on 2014/7/15.
  3. * 一个实现 Recycle 机制的对象
  4. */
  5. public class Data {
  6. /**
  7. * 对象池,就是上文所提到的对象仓库,用于暂时存放不用的对象。
  8. * 用链表来实现对象池结构,直观,高效,易用。
  9. * sPool 便是指向链表头部的引用
  10. */
  11. private static Data sPool;
  12. /**
  13. * 指向链表中的下一个元素,当 next 为 null 时表示已到达链表末端
  14. */
  15. private Data next;
  16.  
  17. /**
  18. * 隐藏构造函数,避免对象被 new 关键字创建
  19. */
  20. private Data(){}
  21.  
  22. /**
  23. * 从池里获取一个新对象,没有的话则返回一个新的实例
  24. * @return 可用的新对象
  25. */
  26. public static Data obtain(){
  27. if(sPool!=null){ // 池中有可用的对象
  28. // 对于对象池来说顺序并没有关系
  29. // 这里取链表的第一个对象,主要是因为方便
  30. Data data = sPool;
  31. sPool = sPool.next;
  32. data.next = null;
  33. return data;
  34. }
  35. return new Data();
  36. }
  37.  
  38. /**
  39. * 将当前对象回收,一旦对象被回收,便不能再使用,代码中也不应存有任何到该对象的引用
  40. */
  41. public void recycle(){
  42. clear(); //清理对象
  43. // 把当前对象作为首元素按入链表中
  44. next = sPool;
  45. sPool = this;
  46. }
  47.  
  48. /**
  49. * 重置对象到刚初始化时的状态
  50. */
  51. private void clear(){
  52.  
  53. }
  54. }

http://dourok.info/2014/07/15/quick-overview-of-recycling-pattern-in-android/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值