定義享元介面,操作外部狀態 MessageModel:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Flyweight
{
///
/// 操作 Message 抽象類別(Flyweight)
///
public abstract class AbstractMessage
{
///
/// 獲取 Message
///
/// MessageModel 清單
public abstract List<MessageModel> Get();
///
/// 插入 Message
///
/// Message 實體物件(外部狀態)
/// 是否成功
public abstract bool Insert(MessageModel mm);
}
}
實作抽象享元,提供 SQL 操作邏輯:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Flyweight
{
///
/// Sql 方式操作 Message(ConcreteFlyweight)
///
public class SqlMessage : AbstractMessage
{
///
/// 獲取 Message
///
/// MessageModel 清單
public override List<MessageModel> Get()
{
List<MessageModel> l = new List<MessageModel>();
l.Add(new MessageModel("SQL方式獲取Message", DateTime.Now));
return l;
}
///
/// 插入 Message
///
/// Message 實體物件(外部狀態)
/// 是否成功
public override bool Insert(MessageModel mm)
{
// 程式碼略
return true;
}
}
}
| 狀態類型 | 定義 | 本例對應 | 儲存位置 |
|---|---|---|---|
| 內部狀態 (Intrinsic) | 可共享、不隨環境變化 | SqlMessage/XMLMessage 實例本身(無欄位) | 享元物件內部 |
| 外部狀態 (Extrinsic) | 不可共享、隨環境變化 | MessageModel (Message內容、發布時間) | 客戶端管理,方法調用時傳入 |
SqlMessage/XMLMessage 無實例欄位,純行為物件,極適合共享。Insert(MessageModel mm) 將外部狀態作為參數傳入,而非儲存在享元內部。享元模式關鍵在於識別並分離外部狀態,使大量相似物件能共享少數享元實例,達到記憶體優化目的。