Flyweight(结构型模式——享元模式)

在这里插入图片描述
享元模式
动机
在这里插入图片描述
意图
在这里插入图片描述
解决
代码:

public enum Color
{
    
    
    
}
class Font//12(4+4+4)bytes+8bytes(由于继承Object 虚表指针+同步控制垃圾回收)=20bytes(共有20bytes的倍乘效应)
{
    
    
     string FontName;//4bytes
     int size;//4bytes
     Color color;//4bytes

     public Font(string name, int size, Color color)
     {
    
    
         this.FontName = name;
         this.size = size;
         this.color = color;
     }

     //重写Equal方法
}

public class Character
//[2(char)+4(Font是类,指针)+20(Font本身)+2(char内存补齐)]+8(由于继承Object 虚表指针+同步控制垃圾回收)=36bytes
{
    
    
    private char c;//16 bit ,2bytes,不需要享元模式
    private Font f;//20bytes,可以用享元模式
    private static Hashtable fontTable;

    Font CFont
    {
    
    
        get
        {
    
    
            return f;
        }
        set
        {
    
    
            if (fontTable.Keys.Equals(f))
            {
    
    
                this.f=fontTable.Keys[f];
            }
            else
            {
    
    
                fontTable.Keys.Add(value);
                this.f = value;
            }
        }
    }
}

class System
{
    
    
    public void Use()
    {
    
    
        //36*100000=3600000byte=3600k=3M,这时需要评估3M对系统的影响,如果是服务器程序,3M可以忽略;如果是桌面程序很小,3M影响很大
        ArrayList list = new ArrayList(100000);
        for (int i = 0; i < list.Count; i++)
        {
    
    
            Character c = new Character();
            list.Add(c);
        }
    }
    
}

将原本的对象(左侧)转换成更小的单元(右侧小方块),然后引用对象,当使用重复对象的时候,无需新建,直接引用即可。
(此时,是否使用享元模式需要进行评估。(评估是否能变成更小单元、引用消耗是否更大等等。))
在这里插入图片描述
结构
在这里插入图片描述
要点
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51565051/article/details/131779089