意图
运用共享技术有效地支持大量细粒度的对象。
场景
在比较底层的系统或者框架级的软件系统中,通常存在大量细粒度的对象。即使细力度的对象,如果使用的数量级很高的话会占用很多资源。比如,游戏中可能会在无数个地方使用到模型数据,虽然从数量上来说模型对象会非常多,但是从本质上来说,不同的模型可能也就这么几个。
此时,我们可以引入享元模式来共享相同的模型对象,这样就可能大大减少游戏对资源(特别是内存)的消耗。
示例代码
using System;
using System.Collections;
using System.Text;
using System.IO;
namespace FlyweightExample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(GC.GetTotalMemory(false));
Random rnd = new Random();
ArrayList al = new ArrayList();
for (int i = 0; i < 10000; i++)
{
string modelName = rnd.Next(2).ToString();
Model model = ModelFactory.GetInstance().GetModel (modelName);
//Model model = new Model (modelName);
al .Add(model );
}
Console.WriteLine(GC.GetTotalMemory(false));
Console.ReadLine();
}
}
class Model
{
private byte[] data;
public Model (string modelName)
{
data = File.ReadAllBytes("c:\\" + modelName + ".txt");
}
}
class ModelFactory
{
private Hashtable modelList = new Hashtable();
private static ModelFactory instance;
public static ModelFactory GetInstance()
{
if (instance == null )
instance = new ModelFactory();
return instance;
}
public Model GetModel (string modelName)
{
Model model = modelList[modelName] as Model ;
if (model == null )
modelList.Add(modelName, new Model (modelName));
return model ;
}
}
}