• 设计模式之:享元模式FlyweightPattern的实现


    享元模式的理解:

    享元模式的定义:运用共享技术支持大量细粒度对象的复用;

    Flyweight Pattern Definition:Use sharing to support large numbers of fine-grained efficiently.

    享元模式关键词:大量、细粒度、复用、享元池、享元工厂

    1. 当系统中存在大量的细粒度的相同或相似对象时,可以使用享元模式;
    2. 享元模式通过共享技术,实现相同或相似对象的重复利用;
    3. 享元的字面理解:也就是分享共享的意思,就是共享的元素、对象;
    4. Flyweight的字面理解:Flyweight本意是拳击运动的一个术语,就是蝇量级的意思,flyweight 蝇量级 112磅;
    5. 享元模式也叫轻量级模式,享元是对Flyweight的意译,直译的话应该叫蝇量级模式;
    6. 英文定义中采用Flyweight,是想表达对象的粒度,也就是fine-grained细粒度的意思;
    7. grain本意表示谷物,grained表示像谷物那种颗粒状态,即粒度,而fine-grained则表示细粒度,例如fine grained soil 细土、coarse grained soil粗粒土;
    8. 享元模式和Unity中的预制体作用类似,享元模式可以通过共享元素生成多个对象,Unity同样可以通过Prefabs生成成千上万的怪物;
    9. 还有诸如对象池、线程池,实际上也是享元模式的使用案例;

    类图with StarUML

    棋子抽象类和2个实现类

    internal abstract class Chessman
    {
    public abstract string GetColor();
    public void Display() { Console.WriteLine($"棋子颜色{this.GetColor()}"); }
    }
    internal class BlackChessman : Chessman
    {
    public override string GetColor() { return "黑色"; }
    }
    internal class WhiteChessman : Chessman
    {
    public override string GetColor() { return "白色"; }
    }

    享元工厂类

    internal class ChessmanFactory
    {
    //饿汉式单例模式
    private static ChessmanFactory instance = new ChessmanFactory();
    //该字典相当于享元池(对象池)Flyweight Pool
    private Dictionary<string, Chessman> dictionary;
    //构造注入依赖项Chessman/BlackChessman/WhiteChessman
    private ChessmanFactory()
    {
    dictionary = new Dictionary<string, Chessman>();
    Chessman black = new BlackChessman();
    Chessman white = new WhiteChessman();
    dictionary.Add("b", black);
    dictionary.Add("w", white);
    }
    //返回唯一实例
    public static ChessmanFactory GetInstance() { return instance; }
    //根据键是b还是w,返回字典中的对应棋子
    public Chessman GetChessman(string color) { return dictionary[color]; }
    }

    客户端

    internal class Program
    {
    static void Main(string[] args)
    {
    Chessman black1, black2, white1, white2;
    ChessmanFactory factory = ChessmanFactory.GetInstance();
    //生成两颗黑子,并比较
    black1 = factory.GetChessman("b");
    black2 = factory.GetChessman("b");
    Console.WriteLine($"两颗黑子是否相同?{black1 == black2}");
    //生成两颗白字,并比较
    white1 = factory.GetChessman("w");
    white2 = factory.GetChessman("w");
    Console.WriteLine($"两颗白子是否相同?{black1 == black2}");
    //显示棋子
    black1.Display();
    black2.Display();
    white1.Display();
    white2.Display();
    Console.Read();
    }
    }

     

    运行结果

     

  • 相关阅读:
    1-(3-磺酸基)丙基-1-甲基-2-吡咯烷酮三氟甲磺酸盐[C3SO3Hnmp]CF3SO3
    Leetcode4.寻找两个正序数组的中位数 - 1/2+2种方法
    机器人系统 ROS 常用命令行工具
    创造建材数字转型新视界,中建材如何多边赋能集团业务快速发展
    【自定义列表头】vue el-table表格自定义列显示隐藏,多级表头自定义列显示隐藏,自由搭配版本和固定列版本【注释详细】
    05 MSYS2中安装树莓派32位和64位ARM交叉编译工具
    linux uboot kenerl filesystem关系
    Linux源码包管理
    Apache Spark 的基本概念
    Cesium关于Entity中的parent、isShowing、entityCollection和监听事件的探讨
  • 原文地址:https://www.cnblogs.com/zhangdezhang/p/16096206.html