ObjectPool 对象池设计模式
程序员文章站
2022-07-04 12:36:18
Micosoft.Extension.ObjectPool 源码架构、模式分析: 三大基本对象: 1. ObjectPool抽象类 2. ObjectPoolProvider抽象类 3. IPooledObjectPolicy接口 ObjectPool的默认实现是DefaultPool,对象池的创建 ......
micosoft.extension.objectpool
源码架构、模式分析:
三大基本对象:
- objectpool抽象类
- objectpoolprovider抽象类
- ipooledobjectpolicy接口
objectpool的默认实现是defaultpool,对象池的创建由objectpoolprovider抽象类的默认实现defaultobjectpoolprovider类实现。
public class defaultobjectpoolprovider : objectpoolprovider { /// <summary> /// the maximum number of objects to retain in the pool. /// </summary> public int maximumretained { get; set; } = environment.processorcount * 2; /// <inheritdoc/> public override objectpool<t> create<t>(ipooledobjectpolicy<t> policy) { if (policy == null) { throw new argumentnullexception(nameof(policy)); } if (typeof(idisposable).isassignablefrom(typeof(t))) { return new disposableobjectpool<t>(policy, maximumretained); } return new defaultobjectpool<t>(policy, maximumretained); } }
ipooledobjectpolicy接口有对应的抽象类及默认实现,对象池中的对象(也就是池对象)的创建或返回由此策略类来控制。
public override t get() { var item = _firstitem; if (item == null || interlocked.compareexchange(ref _firstitem, null, item) != item) { var items = _items; for (var i = 0; i < items.length; i++) { item = items[i].element; if (item != null && interlocked.compareexchange(ref items[i].element, null, item) == item) { return item; } } item = create(); } return item; } // non-inline to improve its code quality as uncommon path [methodimpl(methodimploptions.noinlining)] private t create() => _fastpolicy?.create() ?? _policy.create(); public override void return(t obj) { if (_isdefaultpolicy || (_fastpolicy?.return(obj) ?? _policy.return(obj))) { if (_firstitem != null || interlocked.compareexchange(ref _firstitem, obj, null) != null) { var items = _items; for (var i = 0; i < items.length && interlocked.compareexchange(ref items[i].element, obj, null) != null; ++i) { } } } }
==从整体的设计思路来说,提供者provider用来提供具体的对象池,传入的参数也是策略类,而策略类则把控池对象的具体处理。dotnet core中很多源码的开发模式都是这种:通过policy构建provider,通过provider创建最终的类。也就是说,只通过策略类来实现自定义扩展,这种架构可以借鉴和思考。==
官方实现:
object reuse with objectpool in asp.net core
参考示例:
推荐阅读
-
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
-
浅析php设计模式之数据对象映射模式
-
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
-
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
-
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
-
PHP设计模式之 策略模式Strategy详解【对象行为型】
-
Javascript oop设计模式 面向对象编程简单实例介绍
-
详解java中面向对象设计模式类与类的关系
-
《Head First 设计模式》代码之PHP版(面向对象学习)第1/2页
-
PHP面向对象学习笔记之二 生成对象的设计模式