設計模式十一之享元模式

2021-10-04 05:29:26 字數 2819 閱讀 8898

2. 模式的結構與實現

3. 模式在開源軟體中的應用

在物件導向程式設計過程中,有時會面臨要建立大量相同或相似物件例項的問題。建立那麼多的物件將會耗費很多的系統資源,它是系統效能提高的乙個瓶頸。這些物件有很多相似的地方,如果能把它們相同的部分提取出來共享,則能節省大量的系統資源,這就是享元模式的產生背景。

享元模式(flyweight):運用共享技術來有效地支援大量細粒度物件的復用。它通過共享已經存在的物件大幅度減少需要建立的物件數量、避免大量相似類的開銷,從而提高系統資源的利用率。

享元模式的優點有:

1. 相同物件主要儲存乙份,降低系統中物件的數量,從而降低了系統中細粒度物件給記憶體帶來的壓力;

2. 減少記憶體之外的其他資源的占用

享元模式的缺點有:

1. 關注內、外部狀態,關注執行緒安全問題;

2. 使系統、程式的邏輯複雜化。

1. 常常應用於系統底層的開發,以便解決系統的效能問題;

2. 系統有大量相似物件、需要緩衝池的場景。

享元模式中存在以下兩種狀態:

1. 內部狀態:不會隨著環境的改變而改變的可共享部分;

2. 外部狀態:隨著環境改變而改變的不可共享的部分,享元模式實現的要領就是要區分這兩種狀態,並將外部狀態外部化。

享元模式的主要角色如下:

1. 抽象享元角色(flyweight):是所有具體享元類的基類,為具體享元類規範需要實現的公共介面,非享元的外部狀態以引數的形式通過方法注入;

2. 具體享元角色(concrete flyweight):實現抽象享元角色中定義的介面;

3. 是不可以共享的外部狀態,它以引數的形式注入具體享元的相關方法中;

4. 享元工廠角色(flyweight factory):負責建立和管理享元角色,當客戶請求乙個享元角色時,享元工廠檢查系統中是否存在符合條件的享元物件,如果存在則返回給客戶,如果不存在,則建立乙個新的享元物件。

抽象享元

/**

* 抽象享元 - 員工類

*/public

inte***ce

employee

具體享元*

/**

* 具體享元 - 經理類

*/public

class

manager

implements

employee

@override

public

void

report()

}

非享元角色

/**

* 非享元角色 - 報告內容

*/public

class

reportinfo

public

reportinfo

(string department, string reportcontent)

public string getdepartment()

public

void

setdepartment

(string department)

public string getreportcontent()

public

void

setreportcontent

(string reportcontent)

}

享元工廠

/**

* 享元工廠

*/public

class

employeefactory

return manager;

}}

客戶端

public

class

client

; stream.

iterate(0

, i -

> i +1)

.limit(10

).foreach

(i -

>);

}}# 執行結果如下:

建立了部門經理:op

部門:op, 報告內容為:conent_0...

部門:op, 報告內容為:conent_0...

建立了部門經理:db

部門:db, 報告內容為:conent_2...

建立了部門經理:rd

部門:rd, 報告內容為:conent_3...

部門:rd, 報告內容為:conent_3...

建立了部門經理:qa

部門:qa, 報告內容為:conent_5...

部門:qa, 報告內容為:conent_5...

部門:db, 報告內容為:conent_2...

部門:qa, 報告內容為:conent_5...

部門:rd, 報告內容為:conent_3.

..

public

final

class

integer

extends

number

implements

comparable

}

如果在 -128 - 127 之間就直接從快取中獲取,否則就建立新的物件。

設計模式之 十一 享元模式Flyweight

flyweight模式定義 避免大量擁有相同內容的小類的開銷 如耗費記憶體 使大家共享乙個類 元類 為什麼使用?物件導向語言的原則就是一切都是物件,但是如果真正使用起來,有時物件數可能顯得很龐大,比如,字處理軟體,如果以每個文字都作為乙個物件,幾千個字,物件數就是幾千,無疑耗費記憶體,那麼我們還是要...

設計模式(十一)之 Flyweight 享元

避免大量擁有相同內容的小類的開銷 如耗費記憶體 使大家共享乙個類 元類 物件導向語言的原則就是一切都是物件,但是如果真正使用起來,有時物件數可能顯得很龐 大,比如,字處理軟體,如果以每個文字都作為乙個物件,幾千個字,物件數就是幾千,無疑耗 費記憶體,那麼我們還是要 求同存異 找出這些物件群的共同點,...

C C 設計模式 十一 享元模式

flyweight模式也叫享元模式,是構造型模式之一,它通過與其他類似物件共享資料來減小記憶體占用。在物件導向系統的設計何實現中,建立物件是最為常見的操作。這裡面就有乙個問題 如果乙個應用程式使用了太多的物件,就會造成很大的儲存開銷。特別是對於大量輕量級 細粒度 的物件,比如在文件編輯器的設計過程中...