设计模式-结构型模式:享元模式

享元模式:使用同一个对象,有一些对象不想重复创建,想使用一个

与单例的区别:创建对象是自身控制,还是交由一个工厂控制

string字符串的内存分配使用了享元模式


字符父类

 public abstract class baseWord
    {
        public abstract string GetWord();
    }

L类

public class L : baseWord
    {
        public L()
        {
            Console.WriteLine("L被初始化一次");
        }
        public override string GetWord()
        {
            return "L";
        }
    }

O类

 public class O : baseWord
    {
        public O()
        {
            Console.WriteLine("O被初始化一次");
        }
        public override string GetWord()
        {
            return "O";
        }
    }

工厂代码

 public class XiangYuan
    {

        public static Dictionary<string, baseWord> DicAll = new Dictionary<string, baseWord>();

        public static object _lock = new object();

        public static baseWord GetWords(lolWords lolw)
        {
            switch (lolw)
            {
                case lolWords.L:
                    if (!DicAll.ContainsKey(lolw.ToString()))
                    {
                        lock (_lock)
                        {
                            if (!DicAll.ContainsKey(lolw.ToString()))
                            { 
                                DicAll.Add(lolw.ToString(), new L());
                            }
                        }
                    }
                    return DicAll[lolw.ToString()];
                case lolWords.O:
                     if (!DicAll.ContainsKey(lolw.ToString()))
                    {
                        lock (_lock)
                        {
                            if (!DicAll.ContainsKey(lolw.ToString()))
                            { 
                                DicAll.Add(lolw.ToString(), new O());
                            }
                        }
                    }
                    return DicAll[lolw.ToString()];
                default:
                    return null;
            }
        }

       
    }

    public enum lolWords
    {
        L,
        O
    }

调用

 //输出LOLO

            baseWord l = XiangYuan.GetWords(lolWords.L);
            baseWord o = XiangYuan.GetWords(lolWords.O);
            baseWord l1 = XiangYuan.GetWords(lolWords.L);
            baseWord o1 = XiangYuan.GetWords(lolWords.O);


            Console.WriteLine("{0},{1},{2},{3}",l.GetWord(),o.GetWord(),l1.GetWord(),o1.GetWord());
结果:

只创建了一次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值