当前位置:  编程技术>.net/c#/asp.net

关于Flyweight模式应用实践的相关介绍

    来源: 互联网  发布时间:2014-10-18

    本文导语:  什么是Flyweight模式? 享元模式(Flyweight Pattern)是一种软件开发中的设计模式,其主要解决的问题是通过类对象的共享,来避免大量创建拥有相同内容的对象的开销。可以简单理解用空间换取时间。 举例说明 一般的设计模式...

什么是Flyweight模式?

享元模式(Flyweight Pattern)是一种软件开发中的设计模式,其主要解决的问题是通过类对象的共享,来避免大量创建拥有相同内容的对象的开销。可以简单理解用空间换取时间。

举例说明

一般的设计模式解释中都会用到如下两种场景来解释Flyweight Pattern:

1.GUI字处理软件中每个文字都是对象,缓存这些对象公用。
2.字符串驻留技术(String Interning)。
具体实现

代码如下:

///
  /// 享元模式Flyweight的实现
  ///
  /// Type of object.
  ///
  /// // C# 中数组是引用类型
  /// var pool = new FlyweightObjectPool byte[] (() => new byte[65535]);
  /// pool.Allocate(1000);
  /// var buffer= pool.Dequeue();
  /// // .. do something here ..
  /// pool.Enqueue(buffer);
  ///
  public class FlyweightObjectPool where T : class
  {
    private readonly Func _factoryMethod;
    private readonly ConcurrentQueue _queue = new ConcurrentQueue();

    ///
    /// 享元模式Flyweight的实现
    ///
    /// 分配缓存的方法
    public FlyweightObjectPool(Func factoryMethod)
    {
      _factoryMethod = factoryMethod;
    }

    ///
    /// 分配指定数量的对象
    ///
    /// 指定的数量
    public void Allocate(int count)
    {
      for (int i = 0; i < count; i++)
        _queue.Enqueue(_factoryMethod());
    }

    ///
    /// 缓存一个对象
    ///
    /// 对象
    public void Enqueue(T buffer)
    {
      _queue.Enqueue(buffer);
    }

    ///
    /// 获取一个对象
    ///
    /// 对象
    public T Dequeue()
    {
      T buffer;
      return !_queue.TryDequeue(out buffer) ? _factoryMethod() : buffer;
    }
  }

使用举例

代码如下:

class Program
  {
    static void Main(string[] args)
    {
      var pool = new FlyweightObjectPool(() => new byte[65535]);
      pool.Allocate(1000);

      var buffer = pool.Dequeue();

      // .. do something here ..

      pool.Enqueue(buffer);
    }
  }


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3