設計模式(java) 享元模式

2021-09-08 20:49:25 字數 1793 閱讀 9654

它使用共享物件,用來盡可能減少記憶體使用量以及分享資訊給盡可能多的相似物件;它適合用於只是因重複而導致使用無法令人接受的大量記憶體的大量物件。通常物件中的部分狀態是可以分享。常見做法是把它們放在外部資料結構,當需要使用時再將它們傳遞給享元。

享元模式主要解決的是當系統中存在大的記憶體或物件時,且這些記憶體或物件在很多地方使用頻繁,如果這些記憶體和物件可以重複利用,只需要改變他們的外部狀態來控制其行為即可,這樣就減少了系統對記憶體或大量物件的使用。

以上提到了享元物件的外部狀態,那麼對應的就有內部狀態。

內部狀態:客戶在獲取享元物件的時候確定它,一旦確定後就不可以改變,它的值儲存於享元物件中,一般的與該享元物件是一一對映的關係,類似資料庫的唯一id。

外部狀態:該狀態是由客戶來進行維護和控制的,享元物件中由這些外部狀態的成員,客戶根據自己維護的狀態通過享元物件的方法攝入到其成員中,從而改變享元物件的邏輯行為。

正確的理解內部狀態和外部狀態時建立享元模式結構的關鍵,而這個需要根據具體的業務模型進行規劃設計。

享元模式分為以下角色:

享元介面:享元類的父類,可以是介面也可以是抽象類。

具體共享享元類:擁有業務上共享的外部狀態和內部狀態的具體享元類。

具體非共享享元類:該享元類內部擁有非共享的狀態,一般的共享享元類物件是其的一部分。

享元工廠:用於維護享元類物件,管理享元類物件的獲取,一般的客戶根據內部狀態獲取到相關的享元物件。

如下,我們需要在介面上繪製自己的影象,影象分為1d和2d,這個1d和2d就可以作為影象的內部狀態,一旦它確定了就確定了乙個享元物件。而在顯示過程中我們需要知道影象的大小和顯示位置,這些都是由客戶去決定的,所以這個可以作為享元類的外部狀態。

享元模式類結構:

inte***ce

iimage

class

eimage

implements

iimage

public

void

setimage

(int nposx,

int nposy,

int nwidth,

int nheight)

@override

public

void

draw()

}class

eimagefactory

return image;

}}

客戶**:

public

class

eflyweight

}

輸出:

this image type is1dimage size: 1、10,display position: 0、0.

this image type is2dimage size: 10、10,display position: 0、5.

this image type is2dimage size: 20、10,display position: 5、5.

享元模式在一定程度上是對系統的記憶體使用和效能的優化,通過它我們大大減少了記憶體的使用。而享元物件的個數取決於內部狀態的個數,取決於業務上的需求。它的使用場景也是很多的,我們需要在構建中正確的分析出它的內部狀態和外部狀態。

Java 設計模式 享元模式

在介紹享元模式之前,先來看乙個問題。假設要你去做一款撲克牌遊戲,你會針對撲克牌設計一種怎樣的資料結構呢?因為撲克牌有四種花色,也即紅桃 heart 黑桃 spade 方塊 diamond 梅花 club 有 13 種不同的大小,也即 a k 還有大小王,所以這個類應該很好設計,如下所示 public...

java設計模式 享元模式

使用共享物件可有效地支援大量細粒度物件 因為分配太多的物件到應用程式中將有損程式的效能,同時還容易造成記憶體溢位.1.內部狀態是物件可共享出來的資訊,儲存在享元物件的內部並且不會隨環境的改變而改變.他們可以作為乙個物件的動態附加資訊,不必直接儲存在具體的某個物件中,屬於可以共享的部分.2.外部狀態是...

JAVA設計模式 享元模式

享元模式 運用共享技術有效地支援大量細粒度的物件。介面有方法,具體類實現介面中的方法,工廠生產該實體,若存在則直接返回,不存在則new乙個新的物件返回,無論客戶端呼叫多少次,只產生了乙個實體。享元模式可以避免大量非常相似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來表示資料。如果這些例項除...