首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 設計模式實戰:Flyweight 享元模式完整解析(一)

     編輯:關於C語言

模式意圖

運用共享技術有效支援大量細粒度物件。

應用場景:遊戲模型資料共享

底層系統/框架常存在大量細粒度物件。遊戲中無數位置使用模型資料,數量雖多但本質上僅有幾種模型。引入 Flyweight 共享相同模型物件,大幅降低記憶體消耗。

完整實作代碼


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 // Flyweight
    {
        private byte[] _data;
        public Model(string modelName)
        {
            _data = File.ReadAllBytes(@"c:\" + modelName + ".txt");
        }
    }

    class ModelFactory // Flyweight Factory + Singleton
    {
        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 _modelList[modelName] as Model;
        }
    }
}

關鍵設計亮點

  • Factory 為 Singleton,確保全程序單一享元池
  • Hashtable 快速查找已存在模型
  • Client 程式碼幾乎零差異(註解行切換模式)
  • GC.GetTotalMemory() 量化記憶體效益

內部/外部狀態區分

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
狀態類型範例儲存位置
內部狀態模型資料、紋理、幾何資訊Flyweight 物件內部(共享)
外部狀態座標、旋轉、縮放、顏色色調Client 管理,渲染時傳入