享元模式:使用同一个对象,有一些对象不想重复创建,想使用一个
与单例的区别:创建对象是自身控制,还是交由一个工厂控制
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());
结果:
只创建了一次