设计模式_享元模式

享元模式

  • 0 案例
  • 1 解决了什么问题
  • 2 演变推理
  • 3 解决办法
  • 4 例子
    • UML
    • 代码
      • 类:CharBase
      • 类:CharA
      • 类:CharB
      • 类:CharC
      • 类:CharD
      • 类:Flyweight

0 案例

在这里插入图片描述

1 解决了什么问题

解决了对象复用 ,提供第三方的管理, 能完成对象的复用和创建

2 演变推理

单例模式 + 工厂模式

问题1 需要解决对象的复用 
问题2 同时不想破坏类原有的封装

3 解决办法

解决方法: 
第一步 :单例模式解决对象的复用->
第二步:因为不能破坏封装,这里对类包一层Flyweight
第三步:需要处理一批相识的对象,Flyweight.Dictionary 使用字典来保存这一对的对象(加工厂模式)

4 例子

UML

设计模式_享元模式_第1张图片

代码

类:CharBase

    /// 
    /// 字符基类
    /// 
    public abstract class CharBase
    {
        public abstract string GetChar();
    }

类:CharA

	 /// 
    /// 字符A
    /// 
    public class CharA: CharBase
    {
        // 字符的名字
        private readonly string name = "A"; // charB 是 B ,charC 是 C, charD 是 D

		// 比如:初始化做了很多操作
        public CharA()
        {
            Thread.Sleep(2000);
            Console.WriteLine("初始化完成:" + name);
        }

        public override string GetChar()
        {
            return name;
        }
    }

类:CharB

与charA类似
private readonly string name = “B”;

类:CharC

与charA类似

类:CharD

与charA类似

类:Flyweight

 /// 
    /// 享元类
    /// 
    public class Flyweight
    {
        // 字符类型
        public enum ChatType { A, B, C, D }

        // 字符实例库
        private static Dictionary<ChatType, CharBase> dic = new Dictionary<ChatType, CharBase>();

        // 公开方法:获取字符实例
        // 字典内有  : 找到并返回
        // 字典内没有: 创建一个,添加到字典 ,并返回新创建的
        static public CharBase GetChar(ChatType charType)
        {
            CharBase result = null;
            
            // 有:返回找到的值
            if (dic.ContainsKey(charType))
            {
                result = dic[charType];
                if (null != result)
                    return result;
            }

            // 没:创建
            switch (charType)
            {
                case ChatType.A:
                    result = new CharA();
                    break;
                case ChatType.B:
                    result = new CharB();
                    break;
                case ChatType.C:
                    result = new CharC();
                    break;
                case ChatType.D:
                    result = new CharD();
                    break;

                default:
                    break;
            }

            dic.Add(charType, result);
            return result;
        }
    }

你可能感兴趣的:(设计模式,c#,享元模式,开发语言,设计模式)