展示享元工廠如何共享物件實例,減少記憶體佔用:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Pattern.Flyweight;
public partial class Flyweight : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string[] ary = new string[] { "XML", "sql" };
MessageFactory messageFactory = new MessageFactory();
foreach (string key in ary)
{
AbstractMessage messageObject = messageFactory.GetMessageObject(key);
Response.Write(messageObject.Insert(new MessageModel("插入", DateTime.Now)));
Response.Write("<br />");
Response.Write(messageObject.Get()[0].Message + " " + messageObject.Get()[0].PublishTime.ToString());
Response.Write("<br />");
}
}
}
True
SQL方式獲取Message 2007-5-17 22:20:38
True
XML方式獲取Message 2007-5-17 22:20:38
GetMessageObject 返回同一實例。MessageModel 作為外部狀態傳入,享元物件本身無狀態(或僅有內部狀態)。MessageFactory 透過字典快取管理享元實例。| 優勢 | 說明 |
|---|---|
| 記憶體優化 | 大量相似物件共享單一實例,大幅減少記憶體佔用。 |
| 效能提升 | 避免重複建構大型物件,減少 GC 壓力。 |
| 適用場景 | 大量細粒度物件、物件內部狀態可外部化、物件可共享。 |
| 經典案例 | 文字編輯器字元物件、圖形編輯器圖元、資料庫連線池、執行緒池。 |
MessageModel)。