Flyweight 享元模式
Flyweight:運用共用技術有效地支援大量細粒度的物件。
就是將減少重覆產生物件,相同的物件共用
中間也使用了工廠去取得實體的物件
參考的資源:
http://www.dofactory.com/Patterns/PatternFlyweight.aspx
http://sourcemaking.com/design_patterns/flyweight/c%2523#
以下程式碼來自大話設計模式
Flyweight 母類別 共用元件的超類別
1: abstract class Flyweight {
2: public abstract void Operation(int extrinsicstate);
3: }
具體化 Flyweight
1: class ConcreteFlyweight : Flyweight {
2: public override void Operation(int extrinsicstate)
3: {
4: Console.WriteLine("具體化 Flyweight:" + extrinsicstate);
5: }
6: }
7:
8: class UnsharedConcreteFlyweight : Flyweight {
9: public override void Operation(int extrinsicstate)
10: {
11: Console.WriteLine("不共用具體化 Flyweight:" + extrinsicstate);
12: }
13: }
共用元件的工廠
1: class FlyweightFactory {
2: private Hashtable flyweights = new Hashtable();
3:
4: public FlyweightFactory() {
5: flyweights.Add("X",new ConcreteFlyweight());
6: flyweights.Add("Y", new ConcreteFlyweight());
7: flyweights.Add("Z", new ConcreteFlyweight());
8: }
9:
10: public Flyweight GetFlyweight(string key){
11: return ((Flyweight)flyweights[key]);
12: }
13: }
Client 端的使用程式
1: static void Main(string[] args)
2: {
3: //測試使用 Flyweight
4: int extrinsicstate = 22;
5: FlyweightFactory f_factory = new FlyweightFactory();
6:
7: Flyweight fx = f_factory.GetFlyweight("X");
8: fx.Operation(--extrinsicstate);
9:
10: Flyweight fy = f_factory.GetFlyweight("Y");
11: fy.Operation(--extrinsicstate);
12:
13: Flyweight fz = f_factory.GetFlyweight("Z");
14: fz.Operation(--extrinsicstate);
15:
16: Flyweight fu = new UnsharedConcreteFlyweight();
17: fu.Operation(--extrinsicstate);
18:
19: Console.Read();
20: }
參考第2篇的文章,此篇文章的 Sample Code 比較貼近實物面
http://tech.ddvip.com/2009-04/1238645772113202.html
在請檔的地方加上了判斷不存在則新建
using System;
using System.Collections;
using System.Text;
using System.IO;
namespace FirsDemo
{
class FlyweithtProgram
{
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)
{
//判斷檔案是否存在
if (!File.Exists(modelName + ".txt"))
{
using (System.IO.FileStream fs = System.IO.File.Create(modelName + ".txt"))
{
for (byte i = 0; i < 100; i++)
{
fs.WriteByte(i);
}
}
}
data = File.ReadAllBytes( 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;
}
}
}
ModelFactory 使用了 Singleton
在此處需要去判斷 共用元件(Model)
10000次的存取 是共用 0 和 1 的讀取元件
DotBlogs 的標籤:C# ,Design Pattern