关于Flyweight模式应用实践的相关介绍
发布时间:2021-07-28 21:50:34
什么是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);
}
}


猜你喜欢
- Mapper 就是“映射”的意思,Mapper 文件时 Mybatis 中的 SQL 语句的配置文件
- 本文实例讲述了C#虚函数用法。分享给大家供大家参考。具体如下:using System;namespace Test2 { cl
- 本文较为详细的讲解了C#中Html.RenderPartial与Html.RenderAction的区别,具体分析如下:Html.Rende
- 时间轴,顾名思义就是将发生的事件按照时间顺序罗列起来,给用户带来一种更加直观的体验。京东和淘宝的物流顺序就是一个时间轴,想必大家都不陌生,如
- 其实这个http下载器的功能已经相当完善了,支持:限速、post投递和上传、自定义http header、设置user agent、设置ra
- 在jdk1.4中提出的技术,非阻塞IO,采用的是基于事件处理方式。传统的io技术为阻塞的,比如读一个文件,惹read方法是阻塞的,直到有数据
- Android输入框实时模糊搜索很多开发场景会用到搜索框实时模糊搜索来帮助用户输入内容,如图思路是在EditText 字符变动的时候 弹出L
- 背景:有时候string类型的数据取出来是个很标准的key、value形式,通过Gson的可以直接转成map使用方式:Gson gson =
- 在项目开发过程中,有时会遇到不同程序之间相互调用数据,数据中不免会包含时间,比如ASP.NET调用PHP,牵扯到时间就要做一下处理,PHP程
- 本文实例为大家分享了Android原生视频播放VideoView的具体代码,供大家参考,具体内容如下布局文件activity_video.x
- 本实例实现在jsp页面实现查询全国城市天气预报的功能,供大家参考,具体内容如下实例目录:实现效果:具体思路:从和风天气api那里取得具体城市
- 功能目标使用Treeview控件实现点左边的节点,在右边显示相关的页面知识点Treeview命名空间:System.Windows.Form
- using System; using System.Drawing; using System.Windows.Forms; using
- IntelliJ IDEA 安装后需要进行初始化配置已更加方便使用。本文整理了比较通用的安装后初始配置。本文的版本:IntelliJ IDE
- DSA数字签名,供大家参考,具体内容如下一、实验目的在掌握了ElGamal和Schorr数字签名算法的基础上,进一步地学习和掌握DSA签名算
- IDEA打成jar包并在windows后台运行一、IDEA打成jar包1、File=>Project Structure=>Pr
- Java停止线程的逻辑(协同、通知)在Java程序中,我们想要停止一个线程可以通过interrupt方法进行停止。但是当我们调用interr
- 目录一、事出有因二、解决方案困境三、柳暗花明,终级解决方案第一种实现方案第二种实现方案第三种实现方案四、引发的思考一、事出有因最近有一个场景
- 本文实例为大家分享了RecyclerView实现横向滚动效果的具体代码,供大家参考,具体内容如下布局文件<LinearLayout
- RocketMQ存储路径默认是${ROCKRTMQ_HOME}/store,主要存储消息、主题对应的消息队列的索引等。1、概述查看其目录文件