C#设计模式:享元模式(Flyweight Pattern)

时间:2021-05-03 15:56:21

一,什么是享元模式?

享元模式(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来实现唯一性