Provider模式应用demo
2024-09-01 19:28:26
参考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 对象池设计模式
最新文章
- SQL Server COM 组件创建实例失败
- 不常用的toLocaleString()方法
- 仅仅测试Word2016发布博客
- 搭建hive到eclipse里面
- wcf资料
- Queue 消息的发送与接收(PTP 消息传递模型)
- SOAP webserivce 和 RESTful webservice 对比及区别(转载)
- rtl8201以太网卡调试【转】
- pandas创建一个日期
- Python的自动补全
- Aspose.Cells设置单元格格式
- Hbase(七)hbase高级编程
- UtraEdit正则表达式替换.def
- 贯众云平台脚本编写之判断、循环以及shell命令的使用
- Linux NFS服务器的简明配置6.8
- PIE SDK栅格数据的投影转换
- (转)Unreal Networking Guide Created by Zach Metcalf
- 【bzoj4310/hdu5030-跳蚤】后缀数组
- MYSQL无法连接,提示10055错误尝试解决
- (2)git本地生成SSH关联github
热门文章
- Python和BeautifulSoup进行网页爬取
- 【Android - 控件】之MD - CoordinatorLayout的使用
- session与cookie的介绍和两者的区别之其相互的关系
- 【SpringSecurityOAuth2】源码分析@EnableOAuth2Sso在Spring Security OAuth2 SSO单点登录场景下的作用
- DevOps on DevCloud|如何采用流水线践行CI/CD理念【华为云技术分享】
- 转:linux 安装 Elasticsearch5.6.x 详细步骤以及问题解决方案
- 华为OSPF与ACL综合应用
- 带你从头到尾捋一遍MySQL索引结构(1)
- 剑指offer-31:整数中1出现的次数(从1到n整数中1出现的次数)
- dotnet core gbk 编码错误解决方案