博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象池模式
阅读量:7044 次
发布时间:2019-06-28

本文共 3551 字,大约阅读时间需要 11 分钟。

1、对象池技术并没有限制说只能创建一个对象,而且这种技术同样适用于创建固定数量的对象,然而,这种情况下,你就得面对如何共享对象池里的对象这种问题。

当创建多个对象会的代价会很大的时候,可以考虑使用对象池技术,目前已有的技术比如:线程池技术、数据库连接池技术

2、UML图(astah/jude)下载地址:

 

3、模拟一个数据库连接池进行实现:

实现的接口:

1 package com.xinye.test.pool; 2 /** 3  * 用户需要的实际的东西都实现这个接口 4  * @author xinye 5  * 6  */ 7 public interface IConnection { 8     Object get(); 9     void set(Object obj);10 }

实现类:

1 package com.xinye.test.pool; 2 /** 3  * 用户真正需要的东西,比如数据库连接 4  * @author xinye 5  * 6  */ 7 public class Connection implements IConnection{ 8  9     @Override10     public Object get() {11         // TODO Auto-generated method stub12         return null;13     }14 15     @Override16     public void set(Object obj) {17         // TODO Auto-generated method stub18         19     }20 21 }

实现类的包装对象(添加状态):

1 package com.xinye.test.pool; 2 /** 3  * 池子中放的东西(具有状态以及用户实际需要的东西,实际上就是个包装类) 4  * @author xinye 5  * 6  */ 7 public class PoolItem { 8     public boolean isUse; 9     public IConnection conn;10     public PoolItem(IConnection conn){11         this.conn = conn;12     }13 }

池子管理对象:

1 package com.xinye.test.pool; 2  3 import java.util.ArrayList; 4 /** 5  * 池子管理类 6  * @author wangheng 7  * 8  */ 9 public class PoolManager {10     11     private ArrayList
items = new ArrayList
();12 /**13 * 往池子里面放东西14 * @param conn15 */16 public synchronized void add(IConnection conn){17 items.add(new PoolItem(conn));18 }19 /**20 * 得到池子中的对象21 * @return22 * @throws PoolEmptyException23 */24 public synchronized IConnection get() throws PoolEmptyException{25 int len = items.size();26 for(int i = 0;i < len;i++){27 PoolItem item = items.get(i);28 if(item.isUse == false){29 item.isUse = true;30 return item.conn;31 }32 }33 throw new PoolEmptyException();34 }35 /**36 * 释放对象37 * @param conn38 * @throws PoolEmptyException39 */40 public synchronized void release(IConnection conn) throws PoolEmptyException{41 int len = items.size();42 for(int i = 0;i < len;i++){43 PoolItem item = items.get(i);44 if(conn == item.conn){45 item.isUse = false;46 return;47 }48 }49 throw new PoolEmptyException();50 }51 /**52 * 池子是空的异常53 * @author wangheng54 *55 */56 public static class PoolEmptyException extends Exception{57 /**58 * 59 */60 private static final long serialVersionUID = 5617927009406316965L;61 62 }63 64 }

连接池对象:

1 package com.xinye.test.pool; 2  3 import com.xinye.test.pool.PoolManager.PoolEmptyException; 4  5 /** 6  * 用户真正需要关心的池子 7  * @author xinye 8  * 9  */10 public class ConnectionPool {11     private static PoolManager manager = new PoolManager();12     /**13      * 批量添加连接对象14      * @param count15      */16     public static void addConnections(int count){17         for(int i = 0;i < count;i++){18             manager.add(new Connection());19         }20     }21     /**22      * 得到连接对象23      * @return24      * @throws PoolEmptyException25      */26     public static IConnection getConnection() throws PoolEmptyException{27         return manager.get();28     }29     /**30      * 释放链接31      * @param conn32      * @throws PoolEmptyException33      */34     public static void release(IConnection conn) throws PoolEmptyException{35         manager.release(conn);36     }37 }

 

转载地址:http://jpqal.baihongyu.com/

你可能感兴趣的文章
WPF中,输入完密码回车提交 ,回车触发按钮点击事件
查看>>
mysql数据库优化课程---11、mysql普通多表查询
查看>>
Java实现简单的RPC框架
查看>>
【SSH网上商城项目实战17】购物车基本功能的实现
查看>>
Capacitor 新一代混合应用“神器” 会代替Cordova吗??
查看>>
[工具]我怎么使用思维导图
查看>>
pytorch代码资源
查看>>
Vue(二):调试神器vue-devtools安装和使用
查看>>
[转]RabbitMQ的安装与客户端的简单实用
查看>>
Java多线程编程之单例模式
查看>>
MySQL root密码重置
查看>>
Java中是构造器创建对象吗?
查看>>
(轉貼) 資料庫的三家分晉:Sun併購MySQL (News)
查看>>
谷歌史上十大优秀产品榜:Android傲娇上位
查看>>
Python中的函数(二)
查看>>
matlab练习程序(LBP,局部二值模型)
查看>>
document.createElement("A");
查看>>
浅谈Java中的hashcode方法
查看>>
HDU 3392 Pie
查看>>
理解virtual方法
查看>>