設計模式 享元模式

2021-09-25 06:20:47 字數 2278 閱讀 9624

一. 享元模式

享元模式(flyweight pattern) 也叫 蠅量模式: 運用共享技術有效地支援大量細粒度的物件。

常用於系統底層開發,解決系統的效能問題。像資料庫連線池,裡面都是建立好的連線物件,在這些連線物件中有我們需要的則直接拿來用,避免重新建立,如果沒有我們需要的,則建立乙個。

享元模式能夠解決重複物件的記憶體浪費的問題,當系統中有大量相似物件,需要緩衝池時。不需總是建立新物件,可以從緩衝池裡拿。這樣可以降低系統記憶體,同時提高效率。

享元模式經典的應用場景就是池技術了,string常量池、資料庫連線池、緩衝池等等都是享元模式的應用,享元模式是池技術的重要實現方式。

享元模式提出了兩個要求:細粒度和共享物件。這裡就涉及到內部狀態和外部狀態了,即將物件的資訊分為兩個部分:內部狀態和外部狀態。

內部狀態指物件共享出來的資訊,儲存在享元物件內部且不會隨環境的改變而改變。

外部狀態指物件得以依賴的乙個標記,是隨環境改變而改變的、不可共享的狀態。

舉個例子:圍棋理論上有361個空位可以放棋子,每盤棋都有可能有兩三百個棋子物件產生,因為記憶體空間有限,一台伺服器很難支援更多的玩家玩圍棋遊戲,如果用享元模式來處理棋子,那麼棋子物件就可以減少到只有兩個例項,這樣就很好的解決了物件的開銷。

二. 場景示例

有客戶要求以新聞的形式發布

有客戶要求以部落格的形式發布

需要的**結構相似度很高,而且都不是高訪問量**,如果分成多個虛擬空間來處理,相當於乙個相同**的例項物件很多,造成伺服器的資源浪費。

對於**來說,由於是乙份例項,維護和擴充套件都更加容易

上面的解決思路就可以使用 享元模式 來解決

public

abstract

class

website

//具體**

public

class

concretewebsite

extends

website

@override

public

void

use(user user)

}

// **工廠類,根據需要返回乙個**

public

class

websitefactory

return pool.

get(type);}

//獲取**分類的總數 (池中有多少個**型別)

public

intgetwebsitecount()

}

public

class

user

public string getname()

public

void

setname

(string name)

}

public

class

client

}

三. 享元模式在jdk中的應用

public

final

class

integer

extends

number

implements

comparable

public

static integer valueof

(int i)

}

public

class

flyweight

}

享元模式這樣理解,「享」就表示共享,「元」表示物件。

系統中有大量物件,這些物件消耗大量記憶體,並且物件的狀態大部分可以外部化時,我們就可以考慮選用享元模式。

用唯一標識碼判斷,如果在記憶體中有,則返回這個唯一標識碼所標識的物件,用hashmap/hashtable儲存。

享元模式大大減少了物件的建立,降低了程式記憶體的占用,提高效率。

享元模式提高了系統的複雜度。需要分離出內部狀態和外部狀態,而外部狀態具有固化特性,不應該隨著內部狀態的改變而改變,這是我們使用享元模式需要注意的地方。

使用享元模式時,注意劃分內部狀態和外部狀態,並且需要有乙個工廠類加以控制。

享元模式經典的應用場景是需要緩衝池的場景,比如 string常量池、資料庫連線池。

設計模式(享元模式)

享元模式是設計模式中少數幾個已提高系統效能為目的模式之一。它的核心思想是 如果系統存在多個 相同的物件,那麼只需要共享一分物件的拷貝,而不必為每一次使用都建立新的物件。當有物件被大量復用時,特別是重量級的物件復用可以使用享元模式來提高系統效能。其優點如下 1.可以節省重複建立物件的開銷,因為被享元模...

設計模式 享元模式

享元模式flyweight flyweight 模式是乙個提高程式效率和效能的模式 會大大加快程式的執行速度。把物件中使用比較多,具有共同點的,拿出來做成乙個共享類,這樣就行成了共享模式。如 integer 物件在 128 127 使用的是同乙個物件。在這之間是共享的。享元中的角色 flyweigh...

設計模式 享元模式

舉個圍棋的例子,圍棋的棋盤共有361格,即可放361個棋子。現在要實現乙個圍棋程式,該怎麼辦呢?首先要考慮的是棋子棋盤的實現,可以定義乙個棋子的類,成員變數包括棋子的顏色 形狀 位置等資訊,另外再定義乙個棋盤的類,成員變數中有個容器,用於存放棋子的物件。下面給出 表示 棋子的定義,當然棋子的屬性除了...