Welcome

首页 / 软件开发 / C# / 无废话C#设计模式之十:Flyweight

无废话C#设计模式之十:Flyweight2010-01-13 博客园 lovecherry意图

运用共享技术有效地支持大量细粒度的对象。

场景

在比较底层的系统或者框架级的软件系统中,通常存在大量细粒度的对象。即使细力度的对象,如果使用的数量级很高的话会占用很多资源。比如,游戏中可能会在无数个地方使用到模型数据,虽然从数量上来说模型对象会非常多,但是从本质上来说,不同的模型可能也就这么几个。

此时,我们可以引入享元模式来共享相同的模型对象,这样就可能大大减少游戏对资源(特别是内存)的消耗。

示例代码

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 ;

}

}

}