享元模式
动机
意图
解决
代码:
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);
}
}
}
将原本的对象(左侧)转换成更小的单元(右侧小方块),然后引用对象,当使用重复对象的时候,无需新建,直接引用即可。
(此时,是否使用享元模式需要进行评估。(评估是否能变成更小单元、引用消耗是否更大等等。))
结构
要点