1. 程式人生 > >一看就懂的設計模式--享元模式

一看就懂的設計模式--享元模式

是什麼?

享元模式(Flyweight Pattern)主要用於減少建立物件的數量,以減少記憶體佔用和提高效能。這種型別的設計模式屬於結構型模式,它提供了減少物件數量從而改善應用所需的物件結構的方式。
它適合用於只是因重複而導致使用無法令人接受的大量記憶體的大量物件。通常物件中的部分狀態是可以分享。常見做法是把它們放在外部資料結構,當需要使用時再將它們傳遞給享元

類別

結構模式

類圖

享元模式類圖

適用場景

1、系統中有大量物件。
2、這些物件消耗大量記憶體。
3、這些物件的狀態大部分可以外部化。
4、這些物件可以按照內蘊狀態分為很多組,當把外蘊物件從物件中剔除出來時,每一組物件都可以用一個物件來代替。
5、系統不依賴於這些物件身份,這些物件是不可分辨的。

關鍵

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

常見案例

1、jdk中 int型別的 -128~~127 不管是 == 或者 equals 返回的都會 true, 其內部就是吧 -128~~127的用IntegerCache 快取起來了。非常典型的 享元模式。

優點

大大減少物件的建立,降低系統的記憶體,使效率提高。

缺點

提高了系統的複雜度,需要分離出外部狀態和內部狀態,而且外部狀態具有固有化的性質,不應該隨著內部狀態的變化而變化,否則會造成系統的混亂。

實現步驟

步驟 1

建立一個介面,顏色類介面

package com.pattern.flyweight_pattern;

/**
 * Created by chen on 2018/3/26.
 * <p>
 * Email [email protected]
 * <p>
 * Describe:
 */
public interface Color {

    void print();
}

步驟2

建立實現介面的實體類,這裡參照 int的 用ColorCache 命名。

package com.pattern.flyweight_pattern;

/**
 * Created by chen on 2018/3/26.
 * <p>
 * Email 
[email protected]
* <p> * Describe: */
public class ColorCache implements Color { private String name; public ColorCache(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void print() { System.out.println("顏色是" + name); } }

步驟3

建立一個工廠,生成基於給定資訊的實體類的物件。

package com.pattern.flyweight_pattern;

import java.util.HashMap;

/**
 * Created by chen on 2018/3/26.
 * <p>
 * Email [email protected]
 * <p>
 * Describe:
 */
public class ColorFactory {
    private static final HashMap<String, Color> colorleMap = new HashMap();


    public static Color getColor(String name) {
        Color color1 = (Color)colorleMap.get(name);

        if(color1 == null) {
            System.out.print(name+"  顏色不存在..建立一個放到快取中..");
            color1= new ColorCache(name);
            colorleMap.put(name, color1);
        }
        return color1;
    }

}

步驟4

使用該工廠,通過傳遞顏色資訊來獲取實體類的物件。

package com.pattern.flyweight_pattern;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author chen
 * @date 2018/3/26
 * <p>
 * Email [email protected]
 * <p>
 * Describe:
 */
public class FlyWeightPatternDemo {

    public static void main(String[] args){
        List<String> name=new ArrayList<String>();
        name.add("紅色");
        name.add("黃色");
        name.add("藍色");
        name.add("紫色");
        name.add("紅色");
        name.add("綠色");


        for (String n :name){
            Color color=   ColorFactory.getColor(n);
            color.print();
        }



    }

}

步驟5

檢視輸出

紅色  顏色不存在..建立一個放到快取中..顏色是紅色
黃色  顏色不存在..建立一個放到快取中..顏色是黃色
藍色  顏色不存在..建立一個放到快取中..顏色是藍色
紫色  顏色不存在..建立一個放到快取中..顏色是紫色
顏色是紅色
綠色  顏色不存在..建立一個放到快取中..顏色是綠色

最關鍵

在工廠類中 用 HashMap 存下實現類, 提供一個get方法,判斷HashMap是否有對應的物件,沒有就建立後,放到HashMap 再返回給客戶端,客戶端再次呼叫的時候,就直接從HashMap 中返回物件。

1.png

1.jpg

相關推薦

設計模式--模式

是什麼? 享元模式(Flyweight Pattern)主要用於減少建立物件的數量,以減少記憶體佔用和提高效能。這種型別的設計模式屬於結構型模式,它提供了減少物件數量從而改善應用所需的物件結構的方式。 它適合用於只是因重複而導致使用無法令人接受的大量記憶體的

!【英雄聯盟銳雯】與 Python 詳解設計模式之門面模式

【網路配圖】 設計模式(Design Pattern)是一套被反覆使用、多數人知曉的、經過分類的、程式碼設計經驗的總結。使用設計模式的目的:為了程式碼可重用性、讓程式碼更容易被他人理解、保證程式碼可靠性。設計模式使程式碼編寫真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣

【來自英雄聯盟蓋倫的怒吼】與 Python 詳解設計模式(二)觀察者模式

觀察者模式概述 觀察者模式(有時又被稱為模型-檢視(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟體設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統

設計模式--策略模式

是什麼? 策略模式是指對一系列的演算法定義,並將每一個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化。 分析下定義:策略模式定義和封裝了一系列的演算法,它們是可以相互替換的,也就是說它們具有共性,而它們的共性就體現在策

設計模式(四,策略模式

namespace DiagramMode {     class Program     {         static void Main(string[] args)         {             Context c ;             //根據需求執行某一個策略      

設計模式--模板方法

是什麼? 在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。 或者 在一個方法中定義一個演算法的骨架,而將一些

php微信掃碼支付模式二(圖解

掃碼支付一直坑了我很久,最近解開了這個迷霧,今天給大家詳細的講解一下 直接上官方給的sdk 有些人可能進去了以後 一個是亂碼,一個是模式二的二維碼無法出現 首先我們要解決一個問題 將 /lib/WxPay.Api.php 函式 postXmlCurl 中的兩行程式

系列之 php中的生產者and消費者模式

前言 在工作中常常聽到某某大牛之間的交談會涉及到,xx消費者啊啥的,到底什麼大牛之間講的是什麼? 這篇文章主要解決三個問題: 1.到底什麼是生產者和消費者,以及它們之間的故事 2.它們之間靠什麼交流 3.應用場景 正文 一、什麼是生產者和消費者,以

結合JDK源碼設計模式——模式

系統內存 技術 同時 == span eof 介紹 rabl max 前言   在說享元模式之前,你一定見到過這樣的面試題 public class Test { public static void main(String[] args) {

的手機APP開發教程

軟件開發 移動開發 界面 服務端 平臺 android 教程 效率 疑問 現在的移動互聯網屬於全民的狂歡時代,是每個人、每個用戶、每個企業的歡暢淋漓的時代,所以APP正在勢如破竹地開拓廣闊的市場。手機APP開發指的是專註於手機應用軟件開發與服務,是當前最為迫切的需求。無獨有

的ReactJs入門教程-精華版-轉載

角度 ice ets perf date 入門實例 view 此外 map 傳送門:http://www.cnblogs.com/yunfeifei/p/4486125.html   現在最熱門的前端框架有AngularJS、React、Bootstrap等。自從接觸了R

淺談js設計模式模式

func 參數 如何 del 如果 性能優化 情況 under 核心 享元(flyweight)模式是一種用於性能優化的模式,“fly”在這裏是蒼蠅的意思,意為蠅量級。享元模式的核心是運用共享技術來有效支持大量細粒度的對象。 假設有個內衣工廠,目前的產品有 50種男式內衣和

設計模式——模式

.post 運行時間 AD 重復 this com 本地 方式 sign 享元模式定義 復用內存中已經存在的對象,降低重復創建對象的性能消耗。 享元模式 UML圖 享元共享技術 享元中內部狀態時共享的,Flyweight factory負責維護一個對象池(Flyweigh

設計模式-模式

設計模式 享元模式 場景:象棋中每粒子都是紅方兩顆黑方兩顆。比如:車,棋盤中總共有4個,常規做法是有4個對象,通過享元1個對象搞定。代碼如下: //棋子的外部狀態 class Protertys { public string name { get; set; }

PHP設計模式 - 模式

turn 客戶 有效 nds 一個 true urn cli crete 運用共享技術有效的支持大量細粒度的對象 享元模式變化的是對象的存儲開銷 享元模式中主要角色: 抽象享元(Flyweight)角色:此角色是所有的具體享元類的超類,為這些類規定出需要實現的公共接口

的Centos6.10安裝教程

定義 分區 屬於 虛擬 51cto 默認 救援模式 所有 博客 第一步將虛擬機安裝完畢後,運行虛擬機進行到這個界面下(虛擬機安裝及其配置,詳見論壇內的博客分享在這就不在陳述),:出現的是5條英文由上到下以此分別為:1.安裝或升級2.基本的顯卡驅動來安裝系統(在有些操作系統無

深入解讀HashMap,

als 進行 get next 分配 行處理 而是 pac 代碼包 HashMap 和 HashSet 是 Java Collection Framework 的兩個重要成員,其中 HashMap 是 Map 接口的常用實現類,HashSet 是 Set 接口的常用實現類。

的Markdown語法

大氣 舉例 無法 .cn 拼音輸入法 數學公式 head 特點 thead 目錄 一、Markdown簡介 二、編輯工具推薦 三、語法 1.標題 2.列表 3.引用 4.加粗、斜體等 5.鏈接與圖片 6.更改圖片大小 7.代碼塊 8.表格 9.數學表達式 10.水平分割線

maven如何編譯(陳老師精講

陳老師說了,沒強調的意味著現在不要花精力去研究,會用即可。後面不斷用它自然不就會了嗎。   maven被陳老師講完之後簡直太特麼簡單了,以下是步驟: 1. eclipse- new project--maven 建立maven專案 2. 一直next即可,group id就

設計模式(28)-----結構型模式-----模式

享元模式(Flyweight Pattern)主要用於減少建立物件的數量,以減少記憶體佔用和提高效能。這種型別的設計模式屬於結構型模式,它提供了減少物件數量從而改善應用所需的物件結構的方式。 享元模式嘗試重用現有的同類物件,如果未找到匹配的物件,則建立新物件。我們將通過建立 5 個物件來畫出 20 個分佈於