1. 人人编程首页
  2. 架构设计

对象池设计模式

意图

对象池可以显着提升性能;在初始化类实例的成本高、类的实例化率高、任何一次使用的实例化数量低的情况下,它最有效。

问题

对象池(也称为资源池)用于管理对象缓存。有权访问对象池的客户端可以通过简单地向池询问已经实例化的对象来避免创建新对象。通常池是一个增长的池,即如果池是空的,池本身会创建新的对象,或者我们可以有一个池,它限制创建的对象的数量。

最好将当前未使用的所有可重用对象保留在同一个对象池中,以便它们可以由一个一致的策略管理。为了实现这一点,Reusable Pool 类被设计为一个单例类。

讨论

对象池允许其他人从它的池中“签出”对象,当他们的进程不再需要这些对象时,它们将返回到池中以便重用。

但是,我们不希望进程必须等待特定对象被释放,因此对象池还会根据需要实例化新对象,但还必须实现定期清理未使用对象的工具。

结构

连接池模式的一般思想是,如果可以重用类的实例,则可以避免通过重用它们来创建类的实例。

对象池设计模式
    • Reusable– 此角色中的类实例与其他对象在有限的时间内协作,然后不再需要它们进行协作。
    • Client– 此角色中的类实例使用可重用对象。
    • ReusablePool– 此角色中的类实例管理客户端对象使用的可重用对象。

    通常,最好将Reusable当前未使用的所有对象保留在同一个对象池中,以便它们可以由一个一致的策略管理。为了实现这一点,ReusablePool 类被设计为一个单例类。它的构造函数是私有的,这迫使其他类调用它的 getInstance 方法来获取ReusablePool该类的一个实例。

    Client 对象在需要对象时调用ReusablePool对象的acquireReusable方法ReusableReusablePool对象维护对象的集合Reusable。它使用Reusable对象集合来包含Reusable当前未使用的对象池。

    如果调用该方法时池中有任何Reusable对象acquireReusable,它会从池中删除一个Reusable对象并返回它。如果池为空,则该acquireReusable方法会创建一个Reusable对象(如果可以)。如果该acquireReusable方法不能创建一个新Reusable对象,那么它会一直等到一个Reusable对象返回到集合中。

    客户端对象在完成对象后将对象传递给Reusable对象ReusablePoolreleaseReusable方法。该releaseReusable方法将一个Reusable对象返回到未使用的对象池中Reusable

    Reusable在对象池模式的许多应用中,限制可能存在的对象总数是有原因的。在这种情况下,ReusablePool创建Reusable对象的对象负责创建的对象数量不超过指定的最大数量Reusable。如果ReusablePool对象负责限制它们将创建的对象的数量,那么ReusablePool该类将具有指定要创建的最大对象数量的方法。该方法在上图中表示为 setMaxPoolSize。

例子

对象池模式类似于办公室仓库。雇用新员工时,办公室经理必须为他准备工作空间。她计算着办公室仓库里是否有备用设备。如果是这样,她会使用它。如果没有,她会下订单从亚马逊购买新设备。如果员工被解雇,他的设备会被转移到仓库,当需要新的工作场所时可以将其带走。

对象池设计模式

检查清单

  1. 使用内部 s 的私有数组创建ObjectPoolObject
  2. ObjectPool 类中的创建acquire和方法release
  3. 确保您的 ObjectPool 是 Singleton

经验法则

  • 工厂方法模式可用于封装对象的创建逻辑。但是,它不会在创建后管理它们,对象池模式会跟踪它创建的对象。
  • 对象池通常实现为单例。

本文来自转载,原文链接:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注