Object Pool
设计模式之美:Object Pool(对象池)
索引
意图
运用对象池化技术可以显著地提升性能,尤其是当对象的初始化过程代价较大或者频率较高时。
Object pooling can offer a significant performance boost; it is most effective in situations where the cost of initializing a class instance is high, the rate of instantiation of a class is high.
结构

参与者
Reusable
- 类的实例与其他对象进行有限时间的交互。
ReusablePool
- 管理类的实例。
Client
- 使用类的实例。
适用性
当以下情况成立时可以使用 Object Pool 模式:
- 类的实例可重用于交互。
- 类的实例化过程开销较大。
- 类的实例化的频率较高。
- 类参与交互的时间周期有限。
效果
- 节省了创建类的实例的开销。
- 节省了创建类的实例的时间。
- 存储空间随着对象的增多而增大。
相关模式
- 通常,可以使用 Singleton 模式实现 ReusablePool 类。
- Factory Method 模式封装了对象的创建的过程,但其不负责管理对象。Object Pool 负责管理对象。
实现
实现方式(一):实现 DatabaseConnectionPool 类。
如果 Client 调用 ObjectPool 的 AcquireReusable() 方法来获取 Reusable 对象,当在 ObjectPool 中存在可用的 Reusable 对象时,其将一个 Reusable 从池中移除,然后返回该对象。如果池为空,则 ObjectPool 会创建一个新的 Reusable 对象。

1 namespace ObjectPoolPattern.Implementation1
2 {
3 public abstract class ObjectPool<T>
4 {
5 private TimeSpan _expirationTime;
6 private Dictionary<T, DateTime> _unlocked;
7 private Dictionary<T, DateTime> _locked;
8 private readonly object _sync = new object();
9
10 public ObjectPool()
11 {
12 _expirationTime = TimeSpan.FromSeconds(30);
13 _locked = new Dictionary<T, DateTime>();
14 _unlocked = new Dictionary<T, DateTime>();
15 }
16
17 public ObjectPool(TimeSpan expirationTime)
18 : this()
19 {
20 _expirationTime = expirationTime;
21 }
22
23 protected abstract T Create();
24
25 public abstract bool Validate(T reusable);
26
27 public abstract void Expire(T reusable);
28
29 public T CheckOut()
30 {
31 lock (_sync)
32 {
33 T reusable = default(T);
34
35 if (_unlocked.Count > 0)
36 {
37 foreach (var item in _unlocked)
38 {
39 if ((DateTime.UtcNow - item.Value) > _expirationTime)
40 {
41 // object has expired
42 _unlocked.Remove(item.Key);
43 Expire(item.Key);
44 }
45 else
46 {
47 if (Validate(item.Key))
48 {
49 // find a reusable object
50 _unlocked.Remove(item.Key);
51 _locked.Add(item.Key, DateTime.UtcNow);
52 reusable = item.Key;
53 break;
54 }
55 else
56 {
57 // object failed validation
58 _unlocked.Remove(item.Key);
59 Expire(item.Key);
60 }
61 }
62 }
63 }
64
65 // no object available, create a new one
66 if (reusable == null)
67 {
68 reusable = Create();
69 _locked.Add(reusable, DateTime.UtcNow);
70 }
71
72 return reusable;
73 }
74 }
75
76 public void CheckIn(T reusable)
77 {
78 lock (_sync)
79 {
80 _locked.Remove(reusable);
81 _unlocked.Add(reusable, DateTime.UtcNow);
82 }
83 }
84 }
85
86 public class DatabaseConnection : IDisposable
87 {
88 // do some heavy works
89 public DatabaseConnection(string connectionString)
90 {
91 }
92
93 public bool IsOpen { get; set; }
94
95 // release something
96 public void Dispose()
97 {
98 }
99 }
100
101 public class DatabaseConnectionPool : ObjectPool<DatabaseConnection>
102 {
103 private string _connectionString;
104
105 public DatabaseConnectionPool(string connectionString)
106 : base(TimeSpan.FromMinutes(1))
107 {
108 this._connectionString = connectionString;
109 }
110
111 protected override DatabaseConnection Create()
112 {
113 return new DatabaseConnection(_connectionString);
114 }
115
116 public override void Expire(DatabaseConnection connection)
117 {
118 connection.Dispose();
119 }
120
121 public override bool Validate(DatabaseConnection connection)
122 {
123 return connection.IsOpen;
124 }
125 }
126
127 public class Client
128 {
129 public static void TestCase1()
130 {
131 // Create the ConnectionPool:
132 DatabaseConnectionPool pool = new DatabaseConnectionPool(
133 "Data Source=DENNIS;Initial Catalog=TESTDB;Integrated Security=True;");
134
135 // Get a connection:
136 DatabaseConnection connection = pool.CheckOut();
137
138 // Use the connection
139
140 // Return the connection:
141 pool.CheckIn(connection);
142 }
143 }
144 }

《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
Object Pool的更多相关文章
- 设计模式之美:Object Pool(对象池)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...
- .NET Core中Object Pool的简单使用
前言 复用,是一个重要的话题,也是我们日常开发中经常遇到的,不可避免的问题. 举个最为简单,大家最为熟悉的例子,数据库连接池,就是复用数据库连接. 那么复用的意义在那里呢? 简单来说就是减少不必要的资 ...
- What are the differences between Flyweight and Object Pool patterns?
What are the differences between Flyweight and Object Pool patterns? They differ in the way they are ...
- Object Pool 对象池的C++11使用(转)
很多系统对资源的访问快捷性及可预测性有严格要求,列入包括网络连接.对象实例.线程和内存.而且还要求解决方案可扩展,能应付存在大量资源的情形. object pool针对特定类型的对象循环利用,这些对象 ...
- 对象池模式(Object Pool Pattern)
本文节选自<设计模式就该这样学> 1 对象池模式的定义 对象池模式(Object Pool Pattern),是创建型设计模式的一种,将对象预先创建并初始化后放入对象池中,对象提供者就能利 ...
- Unity Object Pool完全体
using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public ...
- [译]Unity3D内存管理——对象池(Object Pool)
原文地址:C# Memory Management for Unity Developers (part 3 of 3), 其实从原文标题可以看出,这是一系列文章中的第三篇,前两篇讲解了从C#语言本身 ...
- Java小对象的解决之道——对象池(Object Pool)的设计与应用
一.概述 面向对象编程是软件开发中的一项利器,现已经成为大多数编程人员的编程思路.很多高级计算机语言也对这种编程模式提供了很好的支持,例如C++.Object Pascal.Java等.曾经有大量的软 ...
- thinking in object pool
1.背景 对象池为了避免频繁创建耗时或耗资源的大对象,事先在对象池中创建好一定数量的大对象,然后尽量复用对象池中的对象,用户用完大对象之后放回对象池. 2.问题 目前纵观主流语言的实现方式无外乎3个步 ...
随机推荐
- The maximum string content length quota (8192) has been exceeded while reading XML data
原文:The maximum string content length quota (8192) has been exceeded while reading XML data 问题场景:在我们W ...
- Android 最热的高速发展框架XUtils
近期搜了一些框架供刚開始学习的人学习,比較了一下XUtils是眼下git上比較活跃 功能比較完好的一个框架,是基于afinal开发的,比afinal稳定性提高了不少.以下是介绍: 鉴于大家的热情,我又 ...
- SQL Server---触发
今天的第一次SQL Server触发感觉很方便,本文将向您介绍一个简单的SQL Server触发器和简单的使用. 我将确定其.原理.使用细节都是关于. 定义 触发器(trigger)是个特殊的存储过程 ...
- crmplugin项目加入key文件
通常,办crm的plugin发展,然后dll文件导入系统,都需要加入项目key文件,那么怎么办? 在右上角单击指定项目--属性: 点击属性后,弹出属性编辑框: watermark/2/text/aHR ...
- monkey命令详解
标准的monkey 命令 adb shell monkey [options] <eventcount> 例如: adb shell monkey -v 产生500次随机事件,作用在 ...
- Contoso 大学 - 使用 EF Code First 创建 MVC 应用,实例演练
Contoso 大学 Web 示例应用演示了如何使用 EF 技术创建 ASP.NET MVC 应用.示例中的 Contoso 大学是虚构的.应用包括了类似学生注册.课程创建以及教师分配等功能. 这个系 ...
- Jquery zTree实例
zTree[简单介绍] zTree 是利用 JQuery 的核心代码,实现一套能完毕大部分经常使用功能的 Tree 插件 兼容 IE.FireFox.Chrome 等浏览器 在一个页面内可同一时候生成 ...
- SDUT 1124-飞跃荒野(三维BFS)
飞跃原野 Time Limit: 5000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 勇敢的法里奥出色的完毕了任务之后.正在迅速地向自己的基地撤退.但因为 ...
- javascript中类的属性研究
原文:javascript中类的属性研究 本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很 ...
- HTTP 错误500.19 -Internal Server Error
原文:HTTP 错误500.19 -Internal Server Error HTTP 错误500.19 -Internal Server Error 错误代码 0x80070021 评论1 字号: ...