Flyweight 享元模式

Flyweight 享元模式

Flyweight:運用共用技術有效地支援大量細粒度的物件。

就是將減少重覆產生物件,相同的物件共用
中間也使用了工廠去取得實體的物件

參考的資源:

http://www.dofactory.com/Patterns/PatternFlyweight.aspx

http://sourcemaking.com/design_patterns/flyweight/c%2523#

DesignPatternFlyweight

以下程式碼來自大話設計模式

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 的標籤: