参考ObjectPool对象池设计原理还原一个简易的Provider模式。

using System;
using System.Dynamic;
using System.Reflection.Metadata.Ecma335;
using System.Threading;
using System.Xml; namespace ProviderPattern
{
/// <summary>
/// 目标
/// </summary>
/// <typeparam name="T"></typeparam>
public class TargetClass<T> where T:class
{
private ObjectWrapper[] _items;
private ITargetClassPolicy<T> _policy;
public TargetClass(ITargetClassPolicy<T> policy)
{
_policy = policy;
_items = new ObjectWrapper[3];
} public T Get()
{
var items = _items;
for (var i = 0; i < items.Length; i++)
{
var item = items[i].Element;
if (item != null && Interlocked.CompareExchange(ref items[i].Element, null,item) != null)
{
return item;
}
} return Create();
} public void Return(T obj)
{
if (!_policy.Return(obj))
{
return;
}
var items = _items;
for (var i = 0; i < items.Length && Interlocked.CompareExchange(ref items[i].Element, obj, null) != null; ++i)
{
}
} private T Create() => _policy.Create(); private struct ObjectWrapper
{
public T Element;
}
} /// <summary>
/// Provider 提供者
/// </summary>
public class TargetClassProvider
{
public TargetClass<T> Create<T>(ITargetClassPolicy<T> policy) where T : class, new()
{
return new TargetClass<T>(policy);
}
} /// <summary>
/// Policy 策略 规范
/// </summary>
/// <typeparam name="T"></typeparam>
public interface ITargetClassPolicy<T>
{
T Create(); bool Return(T obj);
} /// <summary>
/// Policy 具体策略类
/// </summary>
/// <typeparam name="T"></typeparam>
public class TargetClassPolicy<T> : ITargetClassPolicy<T> where T : class, new()
{
public T Create()
{
return new T();
} public bool Return(T obj)
{
return true;
}
} class User
{
public string Name { get; set; } public int Age { get; set; }
} class Program
{
static void Main(string[] args)
{
var target = new TargetClass<User>(new TargetClassPolicy<User>());
var get = target.Get();
Console.WriteLine($"{get.Name},{get.Age}"); var user1 = new User()
{
Age = 18,
Name = "MicroHeart"
}; var user2 = new User()
{
Age = 19,
Name = "MicroHeart"
}; var user3 = new User()
{
Age = 20,
Name = "MicroHeart"
}; target.Return(user1);
target.Return(user2);
target.Return(user3); var get1 = target.Get();
Console.WriteLine($"{get1.Name},{get1.Age}"); var get2 = target.Get();
Console.WriteLine($"{get2.Name},{get2.Age}"); Console.Read();
}
}
}

存储对象的数组ObjectWrapper内元素的取、还操作通过Interlock.CompareExchange巧妙的实现,并且是线程安全的。

取操作:Interlocked.CompareExchange(ref items[i].Element, null,item)。取完后将元素置为null

还操作:Interlocked.CompareExchange(ref items[i].Element, obj, null)如果元素为null,则赋值

设计原理:通过Policy构建Provider,通过Provider创建最终的目标类(target)。

参考链接:ObjectPool 对象池设计模式

最新文章

  1. SQL Server COM 组件创建实例失败
  2. 不常用的toLocaleString()方法
  3. 仅仅测试Word2016发布博客
  4. 搭建hive到eclipse里面
  5. wcf资料
  6. Queue 消息的发送与接收(PTP 消息传递模型)
  7. SOAP webserivce 和 RESTful webservice 对比及区别(转载)
  8. rtl8201以太网卡调试【转】
  9. pandas创建一个日期
  10. Python的自动补全
  11. Aspose.Cells设置单元格格式
  12. Hbase(七)hbase高级编程
  13. UtraEdit正则表达式替换.def
  14. 贯众云平台脚本编写之判断、循环以及shell命令的使用
  15. Linux NFS服务器的简明配置6.8
  16. PIE SDK栅格数据的投影转换
  17. (转)Unreal Networking Guide Created by Zach Metcalf
  18. 【bzoj4310/hdu5030-跳蚤】后缀数组
  19. MYSQL无法连接,提示10055错误尝试解决
  20. (2)git本地生成SSH关联github

热门文章

  1. Python和BeautifulSoup进行网页爬取
  2. 【Android - 控件】之MD - CoordinatorLayout的使用
  3. session与cookie的介绍和两者的区别之其相互的关系
  4. 【SpringSecurityOAuth2】源码分析@EnableOAuth2Sso在Spring Security OAuth2 SSO单点登录场景下的作用
  5. DevOps on DevCloud|如何采用流水线践行CI/CD理念【华为云技术分享】
  6. 转:linux 安装 Elasticsearch5.6.x 详细步骤以及问题解决方案
  7. 华为OSPF与ACL综合应用
  8. 带你从头到尾捋一遍MySQL索引结构(1)
  9. 剑指offer-31:整数中1出现的次数(从1到n整数中1出现的次数)
  10. dotnet core gbk 编码错误解决方案