如何实现一个对象池
2015-05-12 12:35
405 查看
前言
在某次被面试的时候被问到这个问题,当时觉得有点无从下手,并不是说感觉这个问题有多少的难度,只是缺少一些思考的方向。正好在stackoverflow也有类似的人问,就做一回搬运工。
一般创建池总是有比较明确的目标,这里我们称之为资源。比如说线程池,连接池中的线程和连接就是资源。在明确资源的情况下,可以更好的优化和设计对象池。这里我们创建一个比较通用的对象池。
然后,我们设想好我们希望的调用方式
池的构造函数
使用委托的方式将资源的构造方式传递给Pool
先看AccessMode,这里分为三种:FIFO,LIFO,circular buffer。采用接口抽象这三种访问方式。
FIFO,LIFO的实现比较直观
循环缓冲的方式比较复杂,但是这里不是我们关注的重点。
当然,我们还可以有其他更多的访问方式。通过简单的工厂方法来创建不同的访问方式。
我们有三种加载策略。
在某次被面试的时候被问到这个问题,当时觉得有点无从下手,并不是说感觉这个问题有多少的难度,只是缺少一些思考的方向。正好在stackoverflow也有类似的人问,就做一回搬运工。
一般创建池总是有比较明确的目标,这里我们称之为资源。比如说线程池,连接池中的线程和连接就是资源。在明确资源的情况下,可以更好的优化和设计对象池。这里我们创建一个比较通用的对象池。
开工
首先,定义好我们的资源类然后,我们设想好我们希望的调用方式
池的构造函数
使用委托的方式将资源的构造方式传递给Pool
先看AccessMode,这里分为三种:FIFO,LIFO,circular buffer。采用接口抽象这三种访问方式。
FIFO,LIFO的实现比较直观
循环缓冲的方式比较复杂,但是这里不是我们关注的重点。
当然,我们还可以有其他更多的访问方式。通过简单的工厂方法来创建不同的访问方式。
我们有三种加载策略。
最后,我们使用Semaphore保证创建的资源数目不超过上限。
参考:
http://stackoverflow.com/questions/2510975/c-sharp-object-pooling-pattern-implementation相关文章推荐
- 在Java applet中如何实现一个模式对话框?
- aspx.cs 文件中,想实现弹出一个警告窗口后,点击“确定”后,重定向到一个 list.aspx 页,如何做啊?
- 如何知道一个类都实现了哪些接口和从那个类继承
- 如何在页面内制作一个可以实现'另存为'的链接
- linux下如何实现为一个网卡绑定多个IP地址
- 如何在ORACLE中实现将查询结果存到一个新表中,包括表结构和查询结果?
- 如何实现一个与数据库表字段松耦合的j2ee应用
- 如何在ASP.net中实现限制一个用户名在多个客户端IE登陆的方法
- 如何实现一个文件系统(全文)
- 如何实现一个frame中的按钮事件调用另一个frame的服务器控件
- 如何实现一个简单的remoteing实例
- 如何遍历一个窗体中的某一种控件 c#实现
- 如何遍历一个窗体中的某一种控件 c#实现
- 如何实现从WinForm中打开一个需要身份验证的Web系统?
- 如何完成一个实现Pause和Continue这两个功能的Windows Service
- 自己写一个strcpy(char*dest,char*src),如何在函数内部实现防御性溢出?
- 如何用C#写一个实现像股票行情的波动曲线图
- 在EXE文件中如何实现调用另外一个EXE文件中的方法?
- 如何多次包含一个含有实现的头文件
- 如何实现在RHEL下将多个网卡bonding为一个单一通道?