关于Flyweight模式应用实践的相关介绍
什么是flyweight模式?
享元模式(flyweight pattern)是一种软件开发中的设计模式,其主要解决的问题是通过类对象的共享,来避免大量创建拥有相同内容的对象的开销。可以简单理解用空间换取时间。
举例说明
一般的设计模式解释中都会用到如下两种场景来解释flyweight pattern:
1.gui字处理软件中每个文字都是对象,缓存这些对象公用。
2.字符串驻留技术(string interning)。
具体实现
/// <summary>
/// 享元模式flyweight的实现
/// </summary>
/// <typeparam name="t">type of object.</typeparam>
/// <example>
/// // c# 中数组是引用类型
/// var pool = new flyweightobjectpool byte[] (() => new byte[65535]);
/// pool.allocate(1000);
/// var buffer= pool.dequeue();
/// // .. do something here ..
/// pool.enqueue(buffer);
/// </example>
public class flyweightobjectpool<t> where t : class
{
private readonly func<t> _factorymethod;
private readonly concurrentqueue<t> _queue = new concurrentqueue<t>();
/// <summary>
/// 享元模式flyweight的实现
/// </summary>
/// <param name="factorymethod">分配缓存的方法</param>
public flyweightobjectpool(func<t> factorymethod)
{
_factorymethod = factorymethod;
}
/// <summary>
/// 分配指定数量的对象
/// </summary>
/// <param name="count">指定的数量</param>
public void allocate(int count)
{
for (int i = 0; i < count; i++)
_queue.enqueue(_factorymethod());
}
/// <summary>
/// 缓存一个对象
/// </summary>
/// <param name="buffer">对象</param>
public void enqueue(t buffer)
{
_queue.enqueue(buffer);
}
/// <summary>
/// 获取一个对象
/// </summary>
/// <returns>对象</returns>
public t dequeue()
{
t buffer;
return !_queue.trydequeue(out buffer) ? _factorymethod() : buffer;
}
}
使用举例
class program
{
static void main(string[] args)
{
var pool = new flyweightobjectpool<byte[]>(() => new byte[65535]);
pool.allocate(1000);
var buffer = pool.dequeue();
// .. do something here ..
pool.enqueue(buffer);
}
}