動機:有時採用純粹物件導向方案導致系統中存在大量細粒度對象,帶來很高的運行時代價——記憶體開銷。如果避免大量細粒度對象問題,同時讓客戶程式能透明地使用物件導向特性進行操作?運用共用技術有效地支援大量細粒度的對象。具體做法是把少量的共用Object Storage Service於對象池,大量對象對其進行引用。
應用:圖文編輯器
情境:考慮文字編輯器,如果每個字元產生一個全新獨立對象,將產生大量細粒度對象,該對象的某些屬性對象全新產生將消耗大量記憶體,如字型屬性。如果把這些字型對象放對象池中,字元對象對其進行引用將節省大量記憶體。
結構
代碼實現
namespace DesignPattern.Flyweight
{
public class Charactor
{
private static IList<Font> fontPool = new List<Font>();
private char chr;
private Font font;
public Charactor()
{
}
public char Char
{
get
{
return chr;
}
set
{
chr = value;
}
}
public Font Font
{
get
{
return font;
}
set
{
if (fontPool.Contains(value))
{
font = fontPool[fontPool.IndexOf(value)];
}
else
{
fontPool.Add(value);
font = value;
}
}
}
}
}
namespace DesignPattern.Flyweight
{
public class TextEditer
{
public void Operate()
{
Font font = new Font("宋體", 5);
Charactor c1 = new Charactor();
c1.Char = 'a';
c1.Font = font;
Charactor c2 = new Charactor();
c2.Char = 'a';
c2.Font = font;
}
}
}
要點
1、本設計模式主要解決物件導向的代價問題,一般不觸及物件導向的抽象性問題。
2、本模式通過共用對象來減少系統中對象個數,從而減少記憶體消耗。在具體實現時,要注意狀態的處理。
3、根據實際情況評估對象數量巨大帶來的效能影響,共用對象後對效能的影響。以判斷是否需要使用此模式以及該把那些對象放共用對象池中。