vczh的日常 2018-04-09
一,什么是享元模式?
享元模式(Flyweight Pattern):采用共享技术来避免大量拥有相同内容对象的开销,主要用于减少创建对象的数量,以减少内存占用和提高性能
二,如下代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _11.享元模式
{
//享元模式(FlyWeight):采用共享技术来避免大量拥有相同内容对象的开销
// 当我们项目中创建很多对象,而且这些对象存在许多相同模块,这时,我们可以将这些相同的模块提取出来采用享元模式生成单一对象,再使用这个对象与之前的诸多对象进行配合使用,这样无疑会节省很多空间。
class Program
{
static void Main(string[] args)
{
//相同对象执行时,这样减少创建对象的开销
for (int i = 0; i < 5; i++)
{
Chinese ch = FlyweightFactory.GetChineseObject("中文");
ch.Say();
}
Console.WriteLine("结果存在的对象为:" + FlyweightFactory.GetObjectSize() + "个");
// 不相同对象执行时,会创建新对象
for (int i = 0; i < 5; i++)
{
Chinese ch = FlyweightFactory.GetChineseObject("中文" + i);
ch.Say();
}
Console.WriteLine("结果存在的对象为:" + FlyweightFactory.GetObjectSize() + "个");
}
}
public abstract class People
{
public abstract void Say();
}
public class Chinese : People
{
public string Language { get; set; }
public Chinese(string la)
{
this.Language = la;
}
public override void Say()
{
Console.WriteLine("中国人说:" + Language);
}
}
public class FlyweightFactory
{
private static Dictionary<string, Chinese> dic = new Dictionary<string, Chinese>(); //定义字典来保存不同的变量,相同的则取出
public static Chinese GetChineseObject(string Language)
{
Chinese chinese = null;
if (!dic.TryGetValue(Language, out chinese)) //定义字典来保存不同的变量,相同的则取出
{
chinese = new Chinese(Language);
dic.Add(Language, chinese); //我们将新创建的对象存储到缓存中
}
return chinese;
}
public static int GetObjectSize() //查询字典中的条数
{
return dic.Count();
}
}
}三,我们解析下亨元模式代码设计思路
1,围绕减少相同对象的创建设计使我们代码设计的核心
2,判定对象是否存在,如果存在则取出,否则就创建,这样避免对象的重复,我们通过Key来实现唯一性