設計模式 亨元模式

2021-10-10 07:33:34 字數 2433 閱讀 5410

享元模式也被稱為「蠅量模式」,屬於結構型設計模式的一種,該模式的主要作用就是通過運用共享技術促使大量細粒度的物件可以被復用。

該模式常用於系統底層開發,解決系統效能問題。像我們常用的資料庫連線池,字串常量池等……都是使用享元模式來完成的。「池」中儲存了我們建立好的物件,當需要時進行判斷,如果「池」中有就可以直接從中取出,如果沒有就建立乙個物件並放到池中。

通過使用這些「池」就可以避免重複建立物件而導致記憶體浪費的問題,從而提高系統的效率。

使用享元模式就必須要學會區分物件的外部狀態和內部狀態。

內部狀態:

所謂的內部狀態指的就是物件中可以共享的資訊,這一部分資訊儲存在享關物件的內部並且不會隨著環境而改變。

外部狀態:

外部狀態與內部狀態恰恰相反,它指的是不可以共享的資訊。外部狀態會隨著環境的改變而改變,從而導致該狀態必須由客戶端進行儲存,因為環境的變化是由客戶端引發的。

舉乙個經典的例子,我想大家或多或少都接觸過圍棋或五子棋遊戲。在該遊戲中,有黑白兩種顏色的棋子和不同的落子位置。在開始遊戲後其落子的顏色是固定可以被稱為是棋子的內部狀態,然而落子的位置卻不是固定的,我們就可以認為落子的位置是外部狀態

uml類圖講解:

flyweight:抽象的享元角色,該類定義了具體享元角色需要實現的的方法。

concreteflyweight:具體的享元角色,實現了抽象享元角色中定義的方法。

unsharedconcreteflyweight角色:不可以共享的內容,通常情況通過方法的入參傳遞進具體享元角色中(不一定非要繼承或實現抽象享元角色)。

flyweightfactory:享元工廠角色,該類中定義了乙個「池」,提供從中獲取和新增物件的方法。

client:客戶端測試類。

城市中隨處可見的共享單車就是乙個典型的「享元模式」案例,其中單車的品牌是固定的,使用的人是不確定的。下面就讓我們用**來實現一下。

使用者類

/**

* 使用者類 => 對應unsharedconcreteflyweight角色

* 享元模式中的外部狀態,因為無法確定是哪個使用者在用,所以是不可共享的。

*/public class user

public string getname()

public void setname(string name)

}

共享交通工具抽象類

/**

* 共享交通工具抽象類 => 對應抽象的享元角色

*/public abstract class sharin**ehicle

共享單車類

/**

* 共享單車類 => 對應具體的享元角色

*/public class bicycle extends sharin**ehicle

@override

public void use(user user)

}

共享單車工廠類

/**

* 共享單車工廠類 => 對應享元工廠角色

*/public class bicyclefactory

return pool.get(brand);

}}

客戶端測試類

/**

* 客戶端測試類

*/public class client

}

執行結果

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

2、使用享元模式可以降低記憶體的消耗,減少物件的建立,從而提公升系統的效能。

3、用於存放共享物件的池可以使用hashmap/hashtable來實現。

4、各種緩衝池都是享元模式的經典運用場景。

5、外部狀態具有固化性,不可隨著內部狀態的改變而改變。

6、需要通過乙個工廠類來控制這些物件。

7、享元模式也大大提高了系統的複雜度,需要分離出內部和外部狀態。

設計模式 結構型模式亨元模式

介面shape定義亨元被外部呼叫的方法 具體的亨元實現circle實現介面shape並實現自定義方法 工廠類shapefactory 在呼叫getcircle 的時候從維護的hashmap circlemap 中根據主鍵獲取唯一身份標識的處理類,或者直接取出乙個使用,使用完成之後歸還處理物件 案例1...

JDK中的設計模式 亨元模式

如果程式中需要建立大量重複的物件時,可以考慮使用亨元模式。亨元模式的目的之一就是復用物件,節約記憶體。真實專案中使用亨元模式,還要考慮其他因素,比如執行緒安全 物件汙染等問題 如果乙個程式只負責物件的建立,而不涉及物件的使用,則不用顧慮太多,只要有適用亨元模式的場景,就可以考慮這種模式。jdk中in...

結構型模式 亨元模式

亨元模式 使用共享物件可以有效地支援大量細粒度的物件 亨元模式以共享的方式高效地支援大量的細粒度物件。亨元物件能做到共享的關鍵是區分內部狀態 internal state 和外部狀態 external state 內部狀態是儲存在亨元物件內部的 可以共享的資訊,並且不會隨環境改變而變化。外部狀態是歲...