意图:在创建对象比较昂贵,或者对于特定类型能够创建的对象数目有限制时,管理对象的重用。(比如数据库连接)
问题:对象的创建和/或管理必须遵循一组定义明确的规则集。通常这些规则都与如何创建对象、能够创建多少个对象和在已有对象完成当前任务时如何重用它们等等相关。
解决方案:在需要一个Reusable对象时, Client调用ReusablePool的acquireReusable方法。如果池是空的,那么acquireReusable方法创建一个Reusable对象(如果能够),否则,就等待直到有Reusable对象返回集合。
参与者与协作者:ReusablePool管理着Client所用的Reusable对象的可用性。Client然后在一个有限的时间段内使用Reusable对象的实例,ReusablePool包含所有Reusable对象,这样就可以对其以统一的方式进行管理。
效果:最适用于对对象的需求一直非常稳定的时候,需求变化太大会带来性能问题。ObjectPool中为了解决这一问题,限制了能够创建的对象数量。使管理实例创建的逻辑与实例被管理的类分离,可以得到内聚更好的设计。
实现:如果可以创建的对象数量有限制,或者池的大小有限制,可以使用一个简单的数组来实现池。否则,使用vector对象,负责管理对象池的对象必须惟一能够创建这些对象的对象。ReusablePool是用Singleton模式实现的。另一种变体是在Reusable对象中加一个释放方法——让它自己返回到池。