当前位置: 首页 > 科技观察

对象池模式设计模式(ObjectPoolPattern)

时间:2023-03-16 16:55:05 科技观察

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);IPooledObjectobject=pool.borrowObject();object.operation();pool.returnObject(object);System.out.println();}//抽象对象interfaceIPooledObject{voidoperation();}//具体对象staticclassConcretePoolObjectimplementsIPooledObject{publicvoidoperation(){System.out.println("doing");}}//对象池staticclassObjectPool{privateintstep=10;//当对象是privateintminCount;privateintmaxCount;privateVectorreturneds;//保存未借出的对象privateVectorborroweds;//保存已借出的对象//初始化对象池publicObjectPool(intminCount,intmaxCount){borroweds=newVector();returns=newVector();this.minCount=minCount;this.maxCount=maxCount;refresh(this.minCount);}//因为内部状态是不可变的,所以作为缓存键publicIPooledObjectborrowObject(){IPooledObjectnext=null;if(returneds.size()>0){Iteratori=returneds.iterator();while(i.hasNext()){next=i.next();returneds.remove(next);borroweds.add(next);returnext;}}else{//计算剩余可创建的对象个数intcount=(maxCount-minCount);//remainingnumberofobjectsthatcanbecreated对象数大于一次创建的固定对象数//重新初始化一批固定数量的对象refresh(count>step?step:count);}returnnext;}//返回未使用的对象以供重用{returneds.add(pooledObject);if(borroweds.contains(pooledObject)){borroweds.remove(pooledObject);}}privatevoidrefresh(intcount){for(inti=0;i