ObjectPool 对象池设计模式
程序员文章站
2022-04-11 18:14:02
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
参考示例:
上一篇: 宏碁全新蜂鸟一体机C27上架:8代酷睿+MX130
下一篇: wx-all
推荐阅读
-
PHP 面向对象编程和设计模式 (2)_PHP教程
-
《Head First 设计模式》代码之PHP版(面向对象学习)_PHP
-
PHP面向对象程序设计组合模式与装饰模式详解
-
浅析php设计模式之数据对象映射模式
-
JS设计模式之数据访问对象模式的实例讲解
-
第二章 面向对象的几个基本原则 博客分类: J2EEJava设计模式设计Java基础
-
第二章 面向对象的几个基本原则 博客分类: J2EEJava设计模式设计Java基础
-
BRDIGE(桥接)----对象结构型模式研究 博客分类: 设计模式研究 企业应用SOAP
-
域对象 & 面向对象 & 结构化编程 博客分类: Design 编程OO设计模式DAO数据结构
-
设计模式前言-设计原则、面向对象和Java语言特性