意圖
運用共享技術有效地支持大量細粒度的對象。
場景
在比較底層的系統或者框架級的軟件系統中,通常存在大量細粒度的對象。即使細力度的對象,如果使用的數量級很高的話會占用很多資源。比如,游戲中可能會在無數個地方使用到模型數據,雖然從數量上來說模型對象會非常多,但是從本質上來說,不同的模型可能也就這麼幾個。
此時,我們可以引入享元模式來共享相同的模型對象,這樣就可能大大減少游戲對資源(特別是內存)的消耗。
示例代碼
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 ;
}
}
}