簡介:享元模式(英語:flyweight pattern)是一種軟體設計模式。它使用共享物件,用來盡可能減少記憶體使用量以及分享資訊給盡可能多的相似物件;它適合用於當大量物件只是重複因而導致無法令人接受的使用大量記憶體。通常物件中的部分狀態是可以分享。常見做法是把它們放在外部資料結構,當需要使用時再將它們傳遞給享元。這種型別的設計模式屬於結構型模式。
享元模式嘗試重用現有的同類物件,如果未找到匹配的物件,則建立新物件。我們將通過建立 5 個物件來畫出 20 個分布於不同位置的圓來演示這種模式。由於只有 5 種可用的顏色,所以 color 屬性被用來檢查現有的 circle 物件。
優點:大大減少物件的建立,降低系統的記憶體,使效率提高。
缺點:提高了系統的複雜度,需要分離出外部狀態和內部狀態,而且外部狀態具有固有化的性質,不應該隨著內部狀態的變化而變化,否則會造成系統的混亂。
概要設計:我們將建立乙個 shape 介面和實現了 shape 介面的實體類 circle。下一步是定義工廠類 shapefactory。
shapefactory 有乙個 circle 的 hashmap,其中鍵名為 circle 物件的顏色。無論何時接收到請求,都會建立乙個特定顏色的圓。shapefactory 檢查它的 hashmap 中的 circle 物件,如果找到 circle 物件,則返回該物件,否則將建立乙個儲存在 hashmap 中以備後續使用的新物件,並把該物件返回到客戶端。
flyweightpatterndemo,我們的演示類使用 shapefactory 來獲取 shape 物件。它將向 shapefactory 傳遞資訊(red / green / blue/ black / white),以便獲取它所需物件的顏色。
步驟 1
建立乙個介面。
public
inte***ce
shape
步驟 2
建立實現介面的實體類。
public
class
circle
implements
shape
public
void
setx
(int x)
public
void
sety
(int y)
public
void
setradius
(int radius)
public
void
draw()
}
步驟 3
建立乙個工廠,生成基於給定資訊的實體類的物件
public
class
shapefactory
return circle;
}}
步驟 4
使用該工廠,通過傳遞顏色資訊來獲取實體類的物件。
public
class
flyweightpatterndemo
;public
static
void
main
(string[
] args)
}private
static string getrandomcolor()
private
static
intgetrandomx()
private
static
intgetrandomy()
private
static
intgettradius()
}
結果:
設計模式之享元模式
1 享元模式運用共享技術有效地支援大量細粒度的物件。uml圖如下 2 思考 flyweight根據客戶需求返回已經生成好的物件,但一定要事先生成物件例項嗎?答 實際上是不一定需要的,完全可以初始化的時候什麼也不做,到需要的時候,再去判斷物件是否為null來決定是否例項化。3 思考 為什麼要有unsh...
設計模式之 享元模式
享元模式英文稱為 flyweight pattern 又譯為羽量級模式或者蠅量級模式。享元模式的定義為 採用乙個共享類來避免大量擁有相同內容的 小類 的開銷。這種開銷中最常見 直觀的影響就是增加了記憶體的損耗。享元模式以共享的方式高效的支援大量的細粒度物件,減少其帶來的開銷。在名字和定義中都體現出了...
設計模式之享元模式
享元模式運用共享技術有效地支援大量細粒度的物件。如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時應該考慮使用。物件的大多數狀態可以是外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時也可以考慮用享元模式。享元模式uml圖如下 如下 使用者 cl...