1. 程式人生 > >三分鐘理解“享元模式”——設計模式輕鬆掌握

三分鐘理解“享元模式”——設計模式輕鬆掌握

享原模式的官方定義:

運用共享技術有效地支援大量細粒度的物件。

大白話講:

一個類它可能生成好多物件,但這些物件根據屬性值的不同一共分成N類,每種型別中屬性值都是一樣的。在這種情況下,如果建立好多物件,那麼這些物件中很多屬性值都是重複的,從而造成了大量的記憶體浪費。

而享元模式能夠解決重複物件的記憶體浪費的問題。

享元模式使用一個工廠類,在工廠類中為每種型別建立一個物件,而且每種型別的物件只有一個。

當客戶端需要某種型別的物件的時候,工廠將已建立好的物件給客戶端。由於不建立新的物件了,所以節省了記憶體。

享元模式的類圖:


客戶端通過Factory.getFlyweight(key)來獲取指定型別的Flyweight物件。

但這樣有一個問題,有時候指定型別的物件中的某幾個屬性值可能不同,如果通過工廠獲得的物件,由於他們都是統一個物件,因此他們的屬性值都是完全一樣的,這時就需要將屬性值不一樣的屬性存在外部物件中,外部物件作為引數傳遞給Flyweight的函式,這些函式在執行過程中當遇到特殊屬性的時候就會呼叫外部物件中的值。類圖如下:


這裡的User就是用於儲存特殊值的外部類,在Flyweight類中需要用到屬性特殊值的函式都需要將含有特殊屬性值的外部類物件作為引數傳遞進來。

外部狀態與內部狀態:

在享元物件中,不會隨環境變化而變化的共享屬性稱為享元的內部狀態;

而隨著環境變化而變化的,不可以共享的狀態就是享元的外部狀態。

何時使用?

享元模式可以避免大量非常相似的物件的開銷。

在程式設計中,如果發現需要大量細粒度的類物件來表示資料,而且這些類除了幾個引數不同以外,其他的屬性都是相同的,這時候就可以使用享元模式。類中相同的屬性可以通過工廠類來共享,這些屬性就是享元類的內部狀態;而那些會變化的屬性放在新建的外部物件中,作為引數傳遞給享元類的函式。

享元模式的優點:

享元模式通過共享物件的方式,把所有物件的公共屬性存放在同一個物件中,不同的屬性存放在外部類中,從而起到了節省儲存空間的作用。

相關推薦

分鐘理解模式”——設計模式輕鬆掌握

享原模式的官方定義: 運用共享技術有效地支援大量細粒度的物件。 大白話講: 一個類它可能生成好多物件,但這些物件根據屬性值的不同一共分成N類,每種型別中屬性值都是一樣的。在這種情況下,如果建立好多物

不一樣的模式(設計模式四)

前言 享元模式,表面意思是共享單元,屬於結構型設計模式。哦?good啊,如今共享文化高大上,共享肯定節約很多資源吧,肯定用的地方挺多吧,然而並不多,但是又是不可或缺的一種模式。 至於為什麼,請看正文部分,將會通過計算分析出為什麼用的地方不多,或者說有些地方為什麼不該用,同時得出為什麼屬於結構型,到底屬於結構型

「七天自制PHP框架」第天:PHP實現的設計模式

爭論 框架 啟動 興趣 註意 end php imp close 往期回顧:「七天自制PHP框架」第二天:模型與數據庫,點擊此處 原文地址:http://www.cnblogs.com/sweng/p/6624845.html,歡迎關註:編程老頭 為什麽要使用設計模式?

理解多線程設計模式

ges 關鍵字 mage message 消費 模式 ctu 產生 () 多線程設計模式:1.Single Threaded Execution Pattern [同一時刻只允許一個線程操作] 比喻:三個挑水的和尚,只能同一時間一個人過橋,不然都掉河裏餵魚

理解的單例設計模式

單例模式 singleton 單例模式我們在開發中經常用到,但是我們可能熟知一種單例模式,但是單例模式也有好多種,現在就對幾種單例模式做個比較,明白其中的優缺點: 單例代碼:“餓漢式”,也就是當類加載進來的時候就創建實例,但是這種方式比較消耗資源。(單例模式的第一個版本) public class

用心理解設計模式——設計模式的原則

設計模式總是看完又忘了, 忘了再翻出來看。 我想,應該抽時間仔細捋一遍。 理想的軟體實現應該是:依照功能需求設計介面,模組化組裝,各模組之間只通過介面耦合,模組內部實現絲毫不關心。就像使用電子元件組裝電子產品,可以做到即插即用,靈活拆卸更換,易於擴充套件功能,方便複用。 設計模式是前人總解出

設計模式23種全解析(5分鐘徹底瞭解23種設計模式

一、設計模式的分類 總體來說設計模式分為三大類: 建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。 結構型模式,共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。 行為型模式,共十一種:策略模式、模板

10分鐘看懂動態代理設計模式

動態代理是Java語言中非常經典的一種設計模式,也是所有設計模式中最難理解的一種。本文將通過一個簡單的例子模擬JDK動態代理實現,讓你徹底明白動態代理設計模式的本質,文章中可能會涉及到一些你沒有學習過的知識點或概念。如果恰好遇到了這些知識盲點,請先去學習這部分知識,再來閱讀這篇文章。什麼是代理從字面意思來看,

Java程式設計師從笨鳥到菜鳥(十二)23種設計模式之工廠模式

設計模式的六大原則 開閉原則是最基礎的設計原則,其它的五個設計原則都是開閉原則的具體形態,依照java的語言的稱謂,開閉原則是抽象類,其它的五個原則是具體實現類 開閉原則:軟體實體應當對外擴充套件開放,對修改關閉,通俗點說就是應該在不修改原有程式碼的

Java第十四天(MVC設計模式

MVC設計模式 JSP的開發模式 三層架構&MVC練習 學生資訊管理系統 資料庫準備 CREATE DATABASE

不一樣的介面卡模式(設計模式)

前言 介面卡模式,是一個看起來簡單的模式,同時也是最複雜的模式。 檢視介面卡的作用,直接檢視它的演化,也許更為容易理解。 開車出發 介面卡大概分為兩類,一類為類介面卡,另一類為物件介面卡。 //新介面 public interface ITarget { void Process(); } //舊介面

分鐘帶您搞懂代理模式

全文共1439字,預計閱讀時間:10分鐘 定義:   代理模式(Proxy),為其他物件提供一種代理以控制對這個物件的訪問。   代理模式是一種比較貼近於生活的設計模式,現實生活中也有很多代理模式的例子: 住酒店不一定需要親自到酒店去,還可以通過微信支付下的同程藝龍來訂酒店。 我們可以通過中介去找房子

設計模式 | 4分鐘搞懂10種設計模式

雖然你覺得大炮肯定是個標題黨,但你終究還是點進來了(別打我,手動狗頭保命),畢竟這價效比也太高了,4分鐘10種,如果是真的就賺大發了。 ![img](https://img2020.cnblogs.com/other/1806544/202008/1806544-20200823175355145-2116

命令模式 - 設計模式 - PHP版

spa rec struct exe foo pre cti public his 1 <?php 2 /* 3 * 命令模式 4 * 5 */ 6 //聲明執行操作的接口(Command接口) 7 interface Cook

抽象工廠模式 - 設計模式 - PHP版

ret white elf class 參考 工廠 bsp echo 抽象 1 <?php 2 /* 3 * 抽象工廠模式 4 * 5 * 參考:http://blog.csdn.net/zhaoxuejie/article/detail

適配器模式 - 設計模式 - PHP版

www 適配器模式 code () inter implement sta nbsp 適配器 1 <?php 2 /* 3 * 適配器模式 4 * 5 * 參考:http://www.cnblogs.com/whoamme/p/33243

建造者模式 - 設計模式 - PHP版

fun tail art lac 設計模式 http black color build 1 <?php 2 /* 3 * 建造者模式 4 * 5 * 參考:http://blog.csdn.net/jhq0113/article/det

橋接模式 - 設計模式 - PHP版

bsp div new net abs 設計模式 public face trac 1 <?php 2 /* 3 * 橋接模式 4 * 5 * 參考:http://blog.csdn.net/jhq0113/article/details

職責鏈模式 - 設計模式 - PHP版

sse man article manage pre 直接 nbsp eth protect 1 <?php 2 /* 3 * 職責鏈模式 4 * 5 * 參考:http://blog.csdn.net/jhq0113/arti

設計模式---設計模式的分類

truct 一個 角度 eve 簡單的 tor 合成 memento 步驟 一: 從目的來看: 創建型(Creational)模式:通常和對象的創建有關,涉及到對象實例化方法(共5種) 結構型(Structural)模式:描述的是如何組合類和對象以獲得更大的結構(共