简介
对象池化技术可以显著地提升性能,尤其是当对象的初始化过程代价较大或者频率较高。
源码
ObjectPool:对象池
T Get():从对象池中获取对象。
void Return(T obj):将对象放入对象池中。
DefaultObjectPool:对象池的默认实现类
它实现了Get和Return方法。其实对象池的本质就是它的中的 ObjectWrapper[] _items
,当使用Return方法是,将对象放入ObjectWrapper
数组中。Get方法从数组中取。
IPooledObjectPolicy
主要作用是创建对象和将对象放入连接池中
Create:定义一个创建对象的方法,当连接池中的数量不够取的时候,通过此方法创建对象。
Return:将对象放入连接池中,如果放入成功,返回Ture.否则返回False.
PooledObjectPolicy
它是继承自IPooledObjectPolicy
DefaultPooledObjectPolicy:继承抽象类PooledObjectPolicy
Create:定义一个默认创建对象的方法 new T()
Return:不论是否放入连接池,全部返回True.
ObjectPoolProvider
创建对象池(ObjectPool)
//通过Policy创建ObjectPool
abstract ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy)
DefaultObjectPoolProvider
ObjectPoolProvider的默认实现类
//创建一个可以容纳处理器数量X2的对象池
ObjectPool<T> Create<T>(IPooledObjectPolicy<T> policy)
案例:
不指定创建策略,使用new T()
var objectPool = new DefaultObjectPoolProvider().Create<Person>();
Person p1 = objectPool.Get();//ID=0,Name=null
指定创建策略
var objectPool = new DefaultObjectPoolProvider().Create<Person>(new PersonPoolPolicy());
Person p1 = objectPool.Get();//ID=1,Name=fan
策略:
public class PersonPoolPolicy : PooledObjectPolicy<Person>
{
public override Person Create()
{
return new Person { ID = 1, Name = "fan" };
}
public override bool Return(Person p)
{
if (p.Name != "fan")
{//不允许其他名称的对象放入对象池
return false;
}
return true;
}
}