对象池模式

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 }

对象池模式

时间: 2024-10-10 21:11:25

对象池模式的相关文章

《Unity3D》通过对象池模式,管理场景中的元素

池管理类有啥用? 在游戏场景中,我们有时候会需要复用一些游戏物体,比如常见的子弹.子弹碰撞类,某些情况下,怪物也可以使用池管理,UI部分比如:血条.文字等等 这些元素共同的特性是:存在固定生命周期,使用比较频繁,场景中大量使用. 所以,我们就通过池管理思路,在游戏初始化的时候,生成一个初始的池,存放我们要复用的元素, 当要用到时,从池中取出:生命周期结束,放回到池中. 代码 这个池的参数有两个:1池中存放的元素 2 池的初始容量(如果池不够了,则会按照这个容量进行扩展) 代码如下 using S

java/android 设计模式学习笔记(5)---对象池模式

这次要介绍一下对象池模式(Object Pool Pattern),这个模式为常见 23 种设计模式之外的设计模式,介绍的初衷主要是在平时的 android 开发中经常会看到,比如 ThreadPool 和 MessagePool 等. 在 java 中,所有对象的内存由虚拟机管理,所以在某些情况下,需要频繁创建一些生命周期很短使用完之后就可以立即销毁,但是数量很大的对象集合,那么此时 GC 的次数必然会增加,这时候为了减小系统 GC 的压力,对象池模式就很适用了.对象池模式也是创建型模式之一,

设计模式之对象池模式

对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并行处理), 在大多情况下, 指性能) 简单的说, 在需要时,从池中提取,不用时,放回池中,等待下一个请求. 典型的例子是连接池和线程池. 类图如下: 其中角色如下: ObjectPool 对象池角色: 提供对象池, 其中有两个公共方法, checkOut负责从池中提取对象, checkIn负责回收对象(很多时

游戏开发设计模式之对象池模式(unity3d 示例实现)

前篇:游戏开发设计模式之命令模式(unity3d 示例实现) 博主才学尚浅,难免会有错误,尤其是设计模式这种极富禅意且需要大量经验的东西,如果哪里书写错误或有遗漏,还请各位前辈指正. 原理:从一个固定的池中重用对象,来提升性能和内存的使用,而不是一个一个的分配内存在释放它们.当你需要创造大量重复的对象,而且经常使用这些对象,你就要考虑使用对象池了,因为反复创建销毁就是一个内存反复分配与释放的过程,很容易产生内存碎片.在主机和移动端与PC相比内存稀缺,我们都希望游戏能够更加稳定,而不能有效的管理内

享元模式(对象池模式)

我在网上也看到了一些实现,感觉都不是太满意,所以按照我的理解写了一份 1 <?php 2 3 /** 4 * 具体的需要缓存的对象, 因new的代价太高昂, 所以做一个缓存 5 */ 6 class Worker 7 { 8 public function __construct() 9 { 10 //做一些代价高昂的事情,比如创建线程 11 } 12 13 public function run($class, $functionName) 14 { 15 //对$class做一些事情 16

游戏编程模式-对象池

“使用固定的对象池重用对象,取代单独的分配和释放对象,以此来达到提升性能和优化内存使用的目的.” 动机 假设我们正在致力于游戏的视觉效果优化.当英雄释放魔法时,我们想让一个火花在屏幕上炸裂.这通常需要一个粒子系统(一个用来生成大量小的图形并在它们生存周期产生动画的引擎)来实现.而这个粒子系统实现这个火花的时候会产生大量的粒子,我们需要非常快速的创建这些粒子同时在这些粒子“死亡”的时候释放这些粒子对象.在这里,我们会碰到一个严重的问题——内存碎片化. 碎片化地害处 为游戏和移动设备编程在很多方面都

JAVA模式 对象池 简要代码示例

package org.rui.util; import java.util.ArrayList; /** * 对象复用模式 * * @author PC * */ public class PoolManager { //连接池对象 public static class PoolItem { boolean inUse = false; Object item;//池数据 PoolItem(Object item) { this.item = item; } } //连接池集合 privat

MySQL---数据库从入门走向大神系列(十)-Connection对象池、装饰模式与动态代理模式

问题概述: 之前本系列博客写的,全部都是一个connection对象,不知道大家发现没有,我们既然做了一个Connection工具类,那么大家肯定都是从那里面拿Connection对象的,之前的如果是多线程运行,很容易出问题的,你想想事务处理就知道了,同时用事务处理操作同一个Connection,肯定会出问题的. 例如: 一方的事务在提交的时候,你正好运行了一个事务中的一个操作,那么你这个操作也会被提交,而且你后面的提交或回滚失效的,如果对方把Connection关闭了,你的程序还会挂. 等等问

深度剖析C++对象池自动回收技术实现

http://www.tuicool.com/articles/mQBfQfN 对象池可以显著提高性能,如果一个对象的创建非常耗时或非常昂贵,频繁去创建的话会非常低效.对象池通过对象复用的方式来避免重复创建对象,它会事先创建一定数量的对象放到池中,当用户需要创建对象的时候,直接从对象池中获取即可,用完对象之后再放回到对象池中,以便复用.这种方式避免了重复创建耗时或耗资源的大对象,大幅提高了程序性能.本文将探讨对象池的技术特性以及源码实现. 对象池类图 ObjectPool:管理对象实例的pool