漫谈模式之对象池模式
在之前的篇章,我们已经完成了典型的23种设计模式的讲解 漫谈模式系列(第一版),本文给出23种设计模式之外的一种,即对象池模式。
对象池模式是一种常用的软件设计模式,其目的是通过限制对象的创建和销毁,以减少对象的创建和销毁开销,从而提高程序的性能和效率。
其实,在很多地方,“池化”的思想普遍存在,尤其是对一些资源的创建和销毁比较昂贵的场景,比如数据库连接池、Socket连接池、线程池等。接下来,我们就来简单说说对象池模式。
对象池模式的基本介绍
意图
对象池模式旨在通过限制对象的创建和销毁来提高程序的性能和效率。在该模式中,我们维护一个对象池,这个对象池中保存了多个对象,我们可以重复使用这些对象,而不是频繁地创建和销毁它们。
结构
对象池模式大致结构如下:
这里涉及到的参与者有如下几种:
AbstractObjectPool(抽象对象池)
抽象对象池是用于存储和管理对象的容器。包含:
- 对象获取方法:用于从对象池中获取一个可用的对象。
- 对象回收方法:用于将不再使用的对象返回到对象池中。
- 抽象的对象创建方法create(),用于子类实现
ConcreteObjectPool(具体对象池)
实现抽象类的create方法,包含其它相关属性和方法。
当然,对象的创建,也可以通过Factory来创建。在AbstractObjectPool包含一个Factory的引用,在构造函数赋值即可。
对象池模式的示例
接下来,我们就以SimpleDateFormat对池对象,简单完成对象池模式的示例。
示例一、不包含Factory
抽象对象池
具体对象池
实现基类的create()方法
为了方便,封装从池中获取对象,处理相关业务逻辑后,放回到池子中。
客户端
运行结果
示例二、包含Factory
抽象对象池
具体对象池
同样,为了方便,封装从池中获取对象,处理相关业务逻辑后,放回到池子中。
工厂接口和具体工厂
客户端
同样,运行一下结果,我们能发现运行正常。
至此,一个简单的以SimpleDateFormat为示例的对象池模式示例就完成了。
小结
优缺点
优点
使用对象池模式有助于提高程序的性能和效率。
比如:对象池模式可以用于管理各种对象,例如线程池、数据库连接池、Socket连接池等。在这些应用场景中,对象的创建和销毁通常是非常昂贵的,使用对象池可以有效地减少这些开销。可以重复使用这些对象,而不是频繁地创建和销毁它们。
缺点
- 使用对象池中对象的数量有限,势必会成为一个可伸缩的瓶颈。
- 实际开发过程中,我们需要合理使用对象池,由于是状态的同步,这个并不容易。很容易出现状态不同步导致的线程等待、以及其它诸如内存泄漏等问题。
其它信息
本文给出的示例比较简单,并没有包含预初始化一定数量的池对象,或者池对象过期等处理。一般情况下,
- 我们需要在对象池中预先会初始化一部分池对象进去,以保证可以直接使用,而不是一上来就产生同步竞争。
- 池对象具有一定的时效性,超过一定的阈值,需要回收处理。比如使用HashtableT, Long> 第一个参数为池对象,第二个可以是加入时间(豪秒)。这样的化,我们可以回收不繁忙情况下的池对象。
- ... ...
写好一个对象池其实并不容易,需要考虑的事情还有很多很多,这里就不再具体展开。有兴趣的读者也可以去研读一下Apache common Pool2等源代码,可以了解更多的信息。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 漫谈模式之对象池模式
本文地址: https://pptw.com/jishu/2229.html