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来实现唯一性