.net设计模式 (享元模式)学习笔记

本文深入探讨了享元模式的核心概念及其实现方式,通过具体案例展示了如何利用享元模式优化资源消耗,特别是在线程池和数据库连接池等场景中。文章详细解释了模式的结构和工作原理,并提供了.NET环境下享元模式的应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运用设计模式只是为了解决一类问题的,当解决掉当前一类问题,通常会在解决这个问题时候 带来其他问题  合理应用扬长避短


结构性设计模式:关注的是类与类之间的关系

                          .net设计模式 (享元模式)学习笔记 

 概要:使用场景 线程池 数据库连接池等等这种基于享元模式发开的。核心思想就是对象的重复使用。减少耗时操作的影响 优化相率   以空间(内存) 换时间

    /// <summary>
    ///  抽象方法
    /// </summary>
    public abstract class BaseWord
    {
        public int ID { get; set; }
        public string Remark { get; set; }

        public DateTime CreateTime { get; set; }

        public abstract string DisPlay();

    }

    ////////////////////////////////////    四个继承

    public class E : BaseWord
    {
        public E()
        {
            Thread.Sleep(1000);
            Console.WriteLine("对象E构造中。。");
        }

        public override string DisPlay()
        {
            return "E";
        }
    }


    public class L : BaseWord
    {
        public L()
        {
            Thread.Sleep(1000);
            Console.WriteLine("对象L构造中。。");
        }

        public override string DisPlay()
        {
            return "L";
        }
    }



    public class N : BaseWord
    {
        public N()
        {
            Thread.Sleep(1000);
            Console.WriteLine("对象N构造中。。");
        }

        public override string DisPlay()
        {
            return "N";
        }
    }


    public class V : BaseWord
    {
        public V()
        {
            Thread.Sleep(1000);
            Console.WriteLine("对象V构造中。。");
        }

        public override string DisPlay()
        {
            return "V";
        }
    }










   /// <summary>
    /// 享元模式的 核心处理
    /// </summary>
    public class FlywightFactory
    {
        private static Dictionary<WordType, BaseWord> dicWord = new Dictionary<WordType, BaseWord>();
        private static object dicLock = new object();

        public static BaseWord GetWord(WordType type)
        {
            BaseWord word = null;
            if (dicWord.ContainsKey(type))
            {
                word = dicWord[type];
            }
            else
            {
                lock (dicLock)///多线程 优化  ======> 双if加lock
                {
                    if (dicWord.ContainsKey(type))
                    {
                        word = dicWord[type];
                    }
                    else
                    {
                        switch (type)
                        {
                            case WordType.E: word = new E();
                                break;
                            case WordType.L: word = new L();
                                break;
                            case WordType.V: word = new V();
                                break;
                            case WordType.N: word = new N();
                                break;
                        }
                        dicWord[type] = word;
                    }
                }
            }

            return word;
        }

    }
    public enum WordType
    {
        E,
        L,
        V,
        N
    }
















    /// <summary>
    /// 使用实例
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            ///享元模式的使用 

            BaseWord base1 = FlywightFactory.GetWord(WordType.E);
            BaseWord base2 = FlywightFactory.GetWord(WordType.L);
            BaseWord base3 = FlywightFactory.GetWord(WordType.V);
            BaseWord base4 = FlywightFactory.GetWord(WordType.L);
            BaseWord base5 = FlywightFactory.GetWord(WordType.E);
            BaseWord base6 = FlywightFactory.GetWord(WordType.N);



            ///享元模式的使用不会对 原来的 类型 E,L,N 产生修改, 原有类型依然可以 直接 new();
            BaseWord word0 = new E();
            BaseWord word1 = new L();
            BaseWord word2 = new N();
            BaseWord word3 = new E();



        }
    }
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nicepainkiller

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值