1. 程式人生 > >二十一、享元設計模式

二十一、享元設計模式

1. 享元設計模式介紹

享元模式用來儘可能減少記憶體使用量,它適合用於可能存在大量重複物件的場景,用來快取可共享的物件,達到物件共享、避免建立過多物件的效果。

定義:

使用共享物件可有效地支援大量的細粒度物件。

2. 享元設計模式使用場景

  • 如果一個系統中存在大量的相同或者相似的物件,由於這類物件的大量使用,會造成系統記憶體的消耗,可以使用享元模式來減少系統中物件的數量。
  • 物件的大部分狀態都可以外部化,可這些外部狀態傳入物件。

3. 享元設計模式UML類圖

享元設計模式UML類圖

角色介紹

  • FlyWeight:享元物件抽象基類或者介面
  • ConcreteFlyweight:具體的享元物件
  • FlyweightFactory:享元工廠,負責管理享元物件池和建立享元物件

4. 享元設計模式簡單實現

場景如下: 我們現在需要載入圖片,如果已經載入過圖片了,就直接讀取本地快取,如果沒有載入過圖片,從網路中儲存圖片,以圖片地址為key。

  • (1)、首先定義一個介面:
public interface Pic {
    public void showInfo();
}

showInfo方法用來展示圖片資訊

  • (2)、Bitmap圖片類,實現Pic介面:
public class Bitmap implements Pic {
    private
String src; //圖片地址 public Bitmap(String src) { this.src = src; } @Override public void showInfo() { System.out.println(src); } }
  • (3)、BitmapFactory。圖片工廠類
public class BitmapFactory {
            private Map<String, Bitmap> imgs = new ConcurrentHashMap<String, Bitmap>();
            private
Bitmap bitmap; public Bitmap getBitmap(String src) { if (imgs.get(src) == null) { bitmap = new Bitmap(src); imgs.put(src, bitmap); System.out.println("載入網路."); } else { bitmap = imgs.get(src); System.out.println("載入本地."); } return bitmap; } }

如果本地有圖片,從本地取出;如果沒有圖片,聯網,存入本地。

  • (4)、測試類:
public class Client {
            public static void main(String[] args) {
                BitmapFactory bitmapFactory = new BitmapFactory();
                Bitmap bitMap1 = bitmapFactory.getBitmap("圖片1");
                bitMap1.showInfo();
                Bitmap bitMap2 = bitmapFactory.getBitmap("圖片2");
                bitMap2.showInfo();
                Bitmap bitMap1_1 = bitmapFactory.getBitmap("圖片1");
                bitMap1_1.showInfo();
            }
        }

結果如下:

        載入網路.
        圖片1
        載入網路.
        圖片2
        載入本地.
        圖片1

可以看到,第一次建立後,第三次取出同樣的圖片時,載入的是本地圖片。

5. 享元設計模式在Android原始碼中

享元模式在Android原始碼也比較常見,比如ListView的convertView。

在getView時,判斷convertView是不是null,如果等於null,才會呼叫inflate()方法來載入佈局,不等於null就直接利用convertView。

convertView是我們之前用過的View,只不過移除了屏幕後進入了廢棄的快取中。當convertView不等於null時,將其重新拿出來使用。

ListView享元

6. 總結

享元模式用來儘可能減少記憶體使用量,它適合用於可能存在大量重複物件的場景,來快取可共享的物件,達到物件共享、避免建立過多物件的效果。

  • 優點:
    • 大幅度降低記憶體中物件的數量,減少記憶體開銷。

相關推薦

設計模式

1. 享元設計模式介紹 享元模式用來儘可能減少記憶體使用量,它適合用於可能存在大量重複物件的場景,用來快取可共享的物件,達到物件共享、避免建立過多物件的效果。 定義: 使用共享物件可有效地支援大量的細粒度物件。 2. 享元設計模式使用場景 如

觀察者設計模式

1. 觀察者模式的介紹 觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。 例如:我們在使用應用市場下載應用時,我們的通知欄會有下載進度顯示,我們的詳情

JAVA多執行緒筆記:執行緒上下文設計模式(ThreadLocal)

        上下文是貫穿整個系統或階段生命週期的物件,其中包含了系統全域性的一些資訊,比如登入後的使用者資訊、賬號資訊,以及在程式每一個階段執行時的資料。         設計時要考慮到全域性唯一性,還要考慮有些

Java設計模式模式

享元模式介紹 享元模式適用場景 面向物件技術可以很好的解決一些靈活性或可擴充套件性問題,但在很多情況下需要在系統中增加類和物件的個數。當物件數量太多時,將導致物件建立及垃圾回收的代價過高,造成效能下降等問題。享元模式通過共享相同或者相似的細粒度物件解

再戰設計模式()之模式

getc mage pub 維護 pan 模式 har 創建 vat 享元模式 場景: 內存屬於稀缺資源,不要隨便浪費。如果有很多個完全相同或相似的 對象,我們可以通過享元模式,節省內存. 核心: 本質:享元模式以共享的方式高效地支持大量細粒度對象的重用

事件對象

web lpad 常用 特殊 名詞 版本 特定 cap getchar 二十一、事件對象   JavaScript事件的一個重要方面是它們擁有一些相對一致的特點,可以給你的開發提供更多的強大功能。最方便和強大的就是事件對象,他們可以幫你處理鼠標事件和鍵盤敲擊方面的情況,

正則表達式(re模塊)

ons brush 內容 page 返回對象 req 規則 www. 叠代 re模塊 正則表達式:   字符串模糊匹配 字符(普通字符、元字符) 普通字符:普通字母,字符   完全匹配 import re print(re.findall(‘chen‘,‘shuaiges

安裝軟件包的三種方法RPM包介紹rpm工具用法yum工具用法yum搭建本地倉庫

rpm工具 yum工具 二十一、安裝軟件包的三種方法、RPM包介紹、rpm工具用法、yum工具用法、yum搭建本地倉庫一、安裝軟件包的三種方法rpm工具、yum工具、源碼包RPM工具:是以一種數據庫記錄的方式將需要的套件安裝到Linux主機的一套管理程序。就是說,你的Linux系統中有一個關於RPM的

re模塊和正則表達式

oldboy 騰訊qq 左右 字符集 pytho pin 匹配 sdn 想要 官方定義:正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。 正則表達式 字

隱式遊標

                        

啟動專案出現unsupported modules detected

首先是出現如下情況: unsupported modules detected Compilation is not supported for following modules: app. Unf

SpringBoot之RabbitMQ

一、RabbitMQ核心概念 RabbitMQ是一個由erlang開發的AMQP(Advanved Message Queue Protocol)的開源實現。 Message 訊息,訊息是不具名的,它由訊息頭和訊息體組成。訊息體是不透明的,而訊息頭則由一系列的可選屬性組成

computed Option 計算選項

                    computed Option 計算選項      computed 的作用主要是對原資料進行改造輸出。改造輸出:包括格式的編輯,大小寫轉換,順序重排,新增符號…

資料科學和人工智慧技術筆記 統計學

二十一、統計學 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 貝塞爾校正 貝塞爾的校正是我們在樣本方差和樣本標準差的計算中使用 n

使用Condition重寫waitnotify生產者消費者模型案例

//生產者 public class PushTarget implements Runnable{ private Tmail tmail;//銷售平臺 public PushTarget(Tmail tmail) { this.tmail = tmail; } @Over

設計模式第8篇:設計模式

一.享元設計模式要解決的問題   享元設計模式是一種結構設計模式,當我們要建立同一個類的大量物件時,可以考慮享元設計模式。由於每一個物件都會消耗記憶體空間,享元設計模式通過共享物件達到降低記憶體消耗。 二.享元設計模式的要點   1.需要建立的物件數量特別巨大。   2.物件建立佔用記憶體大且耗時。

Android實戰技巧之:Android原型設計工具探索

移動開發者、移動產品經理和互動設計師在有了產品的想法後會做出一系列的草圖,然後反覆推敲改進,直到自己滿意。這個草圖就是原型設計,是產品設計初期很重要的工作,它是產品的雛形,之後會以此為原型進行開發。 當移動網際網路熱度增加後,一些主打移動原型設計的工具如雨後春

在web(ssm/maven)專案中使用slf4j和log4j2記錄系統日誌

本篇的重點在於LOG4J2,它與LOG4J 第一版區別很大。我將教程放在後面,將一些知識放在前面,所以想看教程的直接拉到後面即可。 理論知識 關於兩版的區別 兩版的不同,直接的表現是在Maven倉庫中log4j 表示第一版,org.apache.logging.log4j 表示第

Java 多執行緒學習筆記() 單例設計模式(延遲載入/懶漢模式)DCL解決執行緒安全問題

package extthread; import test.MyObject; public class MyThread extends Thread { @Override publi

設計模式之——設計模式

享元模式(Flyweight Pattern)主要用於減少建立物件的數量,以減少記憶體佔用和提高效能。這種型別的設計模式屬於結構型模式,它提供了減少物件數量從而改善應用所需的物件結構的方式。享元模式嘗試重用現有的同類物件,如果未找到匹配的物件,則建立新物件。所以其核心就是控