定義:享元模式(flyweight pattern),運用共享技術有效地支援大量細粒度的物件。
型別:結構型模式。
適用情況:
乙個應用程式有大量的物件。
物件的大多數狀態都是外部的。
如果刪除物件的外部狀態,可以和相對較少的共享物件取代很多組物件。
應用程式不依賴物件的標識,即應用程式依賴於物件的抽象介面。
概述:
flyweight,原意為「輕量級選手」的意思。翻譯者將它意為享元模式,是意譯,力求能夠直觀地表現出此模式的目的。享,共享之意。元,基本單元的意思。享元,也就是共享基本單元,也即gof所言的運用共享技術有效地支援大量細粒度的物件。
享元模式的重點在於將物件的「內部狀態」和「外部狀態」抽象出來,內部狀態儲存在享元物件中,而外部狀態在外部儲存。這個才是享元模式的關鍵,網上很多文章根本沒有講透這一點。
下面舉乙個示例。有一棋盤上的圍棋正好是大量細粒度的物件。我們將材質、形狀、製作工藝抽象為內部狀態,而圍棋在棋盤上的位置是標識每一棋子的標記,故棋子的位置抽象為外部狀態。而棋子只有白黑兩種顏色,如果儲存在外部狀態裡,會存兩種顏色很多次。故這裡,白棋、黑棋作為兩個物件存在。
類圖:
參與者:
client,呼叫chessboard得到具體的棋子物件。
chessboard,管理棋子的生成以及儲存棋子的外部狀態,即每個棋子的具體位置。
weiqi,圍棋抽象類,即享元物件,抽象出一些內部狀態來。
whiteweiqi、blackweiqi,兩個派生出的不同顏色的圍棋,實現顏色介面。
示例**:
// flyweight類
public abstract class weiqi
// 具體的flyweight類
public class whiteweiqi : weiqi
} public class blackweiqi : weiqi
} // flyweightfactory類
public class blessboard
public weiqi produce(bool bwthite, point pt)
else
} public weiqi getproduce(point pt)
} foreach (point p in listblack)
} return null;
} }
// client類
class program
}注意:如果是c++,抽象類一定要注意析構函式一定要是虛函式。
優缺點:
優點,減少記憶體的使用。
缺點,加大了結構的複雜度,需要單獨管理外部狀態。
結構型模式之享元模式
享元模式 享元模式結構 flyweight 抽象享元類 通常是乙個介面或抽象類,在抽象享元類中宣告了具體享元類公共的方法,這些方法可以向外界提供享元物件的內部資料 內部狀態 同時也可以通過這些方法設定外部資料 外部狀態 concreteflyweight 具體享元類 它實現了抽象享元類,其實例稱為享...
結構型模式之享元模式
在軟體系統中,有時候會存在資源浪費的情況,例如在計算機記憶體中儲存了多個完全相同或者非常相似的物件,如果這些物件的數量太多將導致系統執行代價過高,記憶體屬於計算機的 稀缺資源 不應該用來 隨便浪費 那麼是否存在一種技術可以用於節約記憶體使用空間,實現對這些相同或者相似物件的共享訪問呢?答案是肯定,這...
結構型模式之享元模式
定義 享元模式 flyweight pattern 運用共享技術有效地支援大量細粒度的物件。型別 結構型模式。適用情況 乙個應用程式有大量的物件。物件的大多數狀態都是外部的。如果刪除物件的外部狀態,可以和相對較少的共享物件取代很多組物件。應用程式不依賴物件的標識,即應用程式依賴於物件的抽象介面。概述...