• 对象池模式


    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     @Override
    10     public Object get() {
    11         // TODO Auto-generated method stub
    12         return null;
    13     }
    14 
    15     @Override
    16     public void set(Object obj) {
    17         // TODO Auto-generated method stub
    18         
    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<PoolItem> items = new ArrayList<PoolItem>();
    12     /**
    13      * 往池子里面放东西
    14      * @param conn
    15      */
    16     public synchronized void add(IConnection conn){
    17         items.add(new PoolItem(conn));
    18     }
    19     /**
    20      * 得到池子中的对象
    21      * @return
    22      * @throws PoolEmptyException
    23      */
    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 conn
    38      * @throws PoolEmptyException
    39      */
    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 wangheng
    54      *
    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 count
    15      */
    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      * @return
    24      * @throws PoolEmptyException
    25      */
    26     public static IConnection getConnection() throws PoolEmptyException{
    27         return manager.get();
    28     }
    29     /**
    30      * 释放链接
    31      * @param conn
    32      * @throws PoolEmptyException
    33      */
    34     public static void release(IConnection conn) throws PoolEmptyException{
    35         manager.release(conn);
    36     }
    37 }
  • 相关阅读:
    Pagination 分页类
    FckEditorAPI未定义错误分析
    提取DataSet数据集中前N条记录
    JS操作JSON[转]
    JS运行textarea内的HTML代码 [转]
    使用Global.asax文件统计网站总访问量
    文章点击数简单实现周、月、年排行
    asp.net文件下载[转]
    三大策略保证论坛不受垃圾信息影响![转]
    图片以二进制形式写入数据库并显示
  • 原文地址:https://www.cnblogs.com/xinye/p/3907642.html
Copyright © 2020-2023  润新知