本文节选自《设计模式就该这样学》1 ObjectPoolPattern的定义。在池中,对象提供者可以使用现有的对象来处理请求,减少频繁创建的对象占用的内存空间和初始化时间。对象池包含一组可以根据需要创建和销毁的已初始化和随时可用的对象。对象池的用户可以从池中获取对象,对其进行操作,在不需要的时候将其归还池,而不是直接销毁。对象池是一个特殊的工厂对象,对象池模式是单例模式加享元模式。2 对象池模式的应用场景对象池模式主要适用于以下应用场景。(1)资源有限的场景。比如在不需要扩展性的环境下(CPU\内存等物理资源有限),CPU性能不够强,内存比较吃紧,垃圾回收,内存抖动都会有比较大的影响,内存管理效率需要改进。响应能力比吞吐量更重要。(2)内存中数量有限的对象。(3)创建成本高的对象,可以考虑池化。补充:使用对象池的常见场景包括使用Socket时的各种连接池、线程池、数据库连接池等。3 对象池模式的UML类图对象池模式的UML类图如下图所示。从上图可以看出,对象池模式主要包括3个角色。(1)对象池(ObjectPool):保存对象并提供访问/返回方法。(2)抽象池化对象(PooledObject):对池中对象的抽象。(3)具体池化对象(ConcretePoolObject):池中对象的封装,封装对象的状态等一些信息。4 对象池模式的常用写法下面是对象池模式的一般写法。publicclassClient{publicstaticvoidmain(String[]args){ObjectPoolpool=newObjectPool(10,50);IPooledObject对象=pool.borrowObject();对象.操作();pool.returnObject(对象);系统。out.println();}//抽象对象接口IPooledObject{voidoperation();}//具体对象staticclassConcretePoolObjectimplementsIPooledObject{publicvoidoperation(){System.out.println("doing");}}//对象池staticclassObjectPool{privateintstep=10;//当对象不够时,每次扩容的个数privateintminCount;私有intmaxCount;私有Vector
