天天看點

Aha!設計模式(64)-享元模式(1)

意圖

通過共享的方式避免在不同對象之間重複建構相同的資料或對象。

動機

面向對象設計技術的應用使程式員在處理複雜系統時,可以将系統中的個體看作一個一個獨立的對象,進而大大降低了處理的複雜性。但是這種處理有時候也會帶來一些問題。

例如,最近經常可以看到使用大量的無人機在空中擺造型的例子,幾千個無人機在空中擺出各種圖案,場景那叫一個壯觀。我們今天就以無人機的通訊為例說明享元模式。首先提兩個假設:

1.無人機數量非常巨大,以至于需要多個品牌的無人機合作演出。

2.不同廠家生産的無人機可以接受的指令的種類,形式,通訊方式都會有所不同。

為了能夠以同樣的方式控制這些無人機,我們可以設計一個通訊協定的轉換類,利用者發出的指令經過這個轉換類的翻譯之後,轉換為各個廠家,型号使用的協定之後再發出。接下來隻要為每台無人機準備好協定轉換的資料即可。但是我們面對的是成千上萬的無人機,為每台無人機準備這樣資料就需要消耗大量的記憶體。

這個問題可以通過享元模式來解決。由于同一廠家,同一型号的無人機可以接受的指令的種類,形式,通訊方式完全一緻,是以我們隻要為每個廠家的每個型号提供唯一的一個轉換子產品就可以了。下面就是這個方案的類圖:

Aha!設計模式(64)-享元模式(1)

每次需要使用Translator的時候,利用者調用以廠家和型号為參數,調用TranslatorFactory的GetTranslator方法,如果TranslatorFactory已經持有與廠家,型号相比對的Translator則直接将其傳回,如果沒有則生成相應的Translator并傳回。這樣就保證了每個廠家,型号的無人機隻會生成一個Translator,進而避免了記憶體空間的浪費。