結構型模式之享元模式

2022-07-30 01:03:13 字數 1504 閱讀 5761

定義:享元模式(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 運用共享技術有效地支援大量細粒度的物件。型別 結構型模式。適用情況 乙個應用程式有大量的物件。物件的大多數狀態都是外部的。如果刪除物件的外部狀態,可以和相對較少的共享物件取代很多組物件。應用程式不依賴物件的標識,即應用程式依賴於物件的抽象介面。概述...