實作抽象享元介面,提供 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;
}
}
}
管理享元實例快取,提供物件獲取介面:
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;
}
}
}
Dictionary<string, AbstractMessage> 儲存已建立的享元實例。SqlMessage/XMLMessage)不保存外部狀態(MessageModel 由客戶端傳入)。case "XML": messageObject = new SqlMessage(); break; // 疑似應為 new XMLMessage()
case "sql": messageObject = new XMLMessage(); break; // 疑似應為 new SqlMessage()
原始碼中 key 與實例化類別似乎互換,實際使用時需修正對應關係。
| 模式角色 | 本例類別 | 說明 |
|---|---|---|
| Flyweight | AbstractMessage | 抽象享元介面 |
| ConcreteFlyweight | SqlMessage, XMLMessage | 具體享元,可共享 |
| FlyweightFactory | MessageFactory | 管理享元快取與創建 |
| Client | 測試頁面 | 持有外部狀態,使用工廠獲取享元 |