設計模式之享元模式

2021-10-06 16:28:12 字數 1515 閱讀 8922

本文根據尚矽谷韓順平老師的設計模式課程編寫設計模式

乙個專案需求

小型的外包專案,給客戶a做乙個產品展示**,客戶a的朋友感覺效果不錯,也希望做這樣的產品展示**,但是要求都有些不同:

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

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

基本介紹

角色

flyweight 是抽象的享元角色,他是產品的抽象類,同時定義出物件的外部狀態和內部狀態的介面或實現

concreteflyweight 是具體的享元角色,是具體的產品類,實現抽象角色定義相關業務

unsharedconcreteflyweight 是不可共享的角色,一般不會出現在享元工廠

flyweightfactory 享元構建乙個池容器,同時提供從池中獲取物件方法

**

//具體的**

public

class

concretewebsite

extends

website

@override

public

void

use(

)}

public

abstract

class

website

//**工廠類

public

class

websitefactory

return

(website)pool.

get(type);}

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

public

intgetwebsitecount()

}

public

class

client

}

原始碼

jdk中的integer 使用的是享元模式

注意細節

在享元模式這樣理解, 剪"就表示共享, 元表示物件

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

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

享元模式大大減少了物件的建立,降低了程式內在的占用,提高效率

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

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

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

設計模式之享元模式

1 享元模式運用共享技術有效地支援大量細粒度的物件。uml圖如下 2 思考 flyweight根據客戶需求返回已經生成好的物件,但一定要事先生成物件例項嗎?答 實際上是不一定需要的,完全可以初始化的時候什麼也不做,到需要的時候,再去判斷物件是否為null來決定是否例項化。3 思考 為什麼要有unsh...

設計模式之 享元模式

享元模式英文稱為 flyweight pattern 又譯為羽量級模式或者蠅量級模式。享元模式的定義為 採用乙個共享類來避免大量擁有相同內容的 小類 的開銷。這種開銷中最常見 直觀的影響就是增加了記憶體的損耗。享元模式以共享的方式高效的支援大量的細粒度物件,減少其帶來的開銷。在名字和定義中都體現出了...

設計模式之享元模式

享元模式運用共享技術有效地支援大量細粒度的物件。如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時應該考慮使用。物件的大多數狀態可以是外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時也可以考慮用享元模式。享元模式uml圖如下 如下 使用者 cl...