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

C# 設計模式:享元模式具體享元與工廠實作 (3/4)

     編輯:關於C語言

具體享元:XMLMessage

實作抽象享元介面,提供 XML 操作邏輯:

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Flyweight
{
    /// 
    /// XML 方式操作 Message(ConcreteFlyweight)
    /// 
    public class XMLMessage : AbstractMessage
    {
        /// 
        /// 獲取 Message
        /// 
        /// MessageModel 清單
        public override List<MessageModel> Get()
        {
            List<MessageModel> l = new List<MessageModel>();
            l.Add(new MessageModel("XML方式獲取Message", DateTime.Now));
            return l;
        }

        /// 
        /// 插入 Message
        /// 
        /// Message 實體物件
        /// 是否成功
        public override bool Insert(MessageModel mm)
        {
            // 程式碼略
            return true;
        }
    }
}

享元工廠:MessageFactory

管理享元實例快取,提供物件獲取介面:

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Flyweight
{
    /// 
    /// Message 工廠(FlyweightFactory)
    /// 
    public class MessageFactory
    {
        private Dictionary<string, AbstractMessage> _messageObjects = new Dictionary<string, AbstractMessage>();

        /// 
        /// 獲取 Message 物件
        /// 
        /// key
        /// AbstractMessage 實例
        public AbstractMessage GetMessageObject(string key)
        {
            AbstractMessage messageObject = null;

            if (_messageObjects.ContainsKey(key))
            {
                messageObject = _messageObjects[key];
            }
            else
            {
                switch (key)
                {
                    case "XML": messageObject = new SqlMessage(); break;
                    case "sql": messageObject = new XMLMessage(); break;
                }

                _messageObjects.Add(key, messageObject);
            }

            return messageObject;
        }
    }
}

FlyweightFactory 關鍵設計

  • 快取字典:Dictionary<string, AbstractMessage> 儲存已建立的享元實例。
  • 單例保證:相同 key 返回同一實例,實現物件共享。
  • 延遲初始化:首次請求時才建立實例。
  • 內部狀態封裝:享元物件(SqlMessage/XMLMessage)不保存外部狀態(MessageModel 由客戶端傳入)。

程式碼註記:Switch case 邏輯疑似互換

case "XML": messageObject = new SqlMessage(); break;  // 疑似應為 new XMLMessage()
case "sql": messageObject = new XMLMessage(); break;  // 疑似應為 new SqlMessage()

原始碼中 key 與實例化類別似乎互換,實際使用時需修正對應關係。

享元模式角色對應

模式角色本例類別說明
FlyweightAbstractMessage抽象享元介面
ConcreteFlyweightSqlMessage, XMLMessage具體享元,可共享
FlyweightFactoryMessageFactory管理享元快取與創建
Client測試頁面持有外部狀態,使用工廠獲取享元
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved