以模拟连接池为例:
- UML图:
- 代码实现:
public abstract class BaseLink
{
/// <summary>
/// 连接Id
/// </summary>
public string LinkId { get; set; }
/// <summary>
/// 是否使用
/// </summary>
public bool IsUsed { get; set; }
/// <summary>
/// 使用连接
/// </summary>
/// <returns></returns>
public void ShowLink()
{
Console.WriteLine($"连接Id:{LinkId},是否使用:{IsUsed}");
}
/// <summary>
/// 使用连接
/// </summary>
/// <returns></returns>
public abstract void UseLink();
/// <summary>
/// 删除连接
/// </summary>
/// <returns></returns>
public abstract void DelLink();
}
public class Link : BaseLink
{
public override void DelLink()
{
this.IsUsed = false;
Console.WriteLine("删除连接2");
}
public override void UseLink()
{
this.IsUsed = true;
Console.WriteLine("建立连接2");
}
}
/// <summary>
/// 连接池
/// </summary>
public class LinkPool
{
private static Dictionary<string, BaseLink> dics = new Dictionary<string, BaseLink>();
static LinkPool()
{
dics.Add("连接1", new Link
{
IsUsed = false,
LinkId = Guid.NewGuid().ToString()
});
dics.Add("连接2", new Link
{
IsUsed = false,
LinkId = Guid.NewGuid().ToString()
});
dics.Add("连接3", new Link
{
IsUsed = false,
LinkId = Guid.NewGuid().ToString()
});
}
/// <summary>
/// 获取连接
/// </summary>
/// <returns></returns>
public static BaseLink GetLink()
{
BaseLink link = null;
foreach (var item in dics)
{
if (item.Value.IsUsed == false)
{
item.Value.IsUsed = true;
link = item.Value;
break;
}
}
if (link == null)
{
link = new Link
{
IsUsed = true,
LinkId = Guid.NewGuid().ToString()
};
}
return link;
}
}
- 调用端代码:
class Program
{
static void Main(string[] args)
{
var link = LinkPool.GetLink();
link.ShowLink();
Console.Read();
}
}
- 运行效果:
- 总结
享元模式,运用共享技术有效地支持大量细粒度的对象。
代码下载地址:https://pan.baidu.com/s/1QLzYQWPvLb8XuZ4hszxsfQ ht9p