享元模式-Flyweight(Java實現)

享元模式-Flyweight

享元模式的主要目的是實現對象的共享,即共享池,當系統中對象多的時候可以減少內存的開銷,通常與工廠模式一起使用。

本文中的例子如下:

使用享元模式: 小明想看編程技術的書, 就到家里的書架上拿, 如果有就直接看, 沒有就去買一本, 回家看. 看完了就放到家里的書架上, 以后再想看了直接就在書架上拿, 不需要再去買同樣的這本書了.

不適用享元模式:?小明想看編程技術的書, 就去書店里買一本回家看, 買完后看完了, 書就不知道丟到了哪里去了. 下次想看的時候就找不到了, 還是得去書店里重新買......又得花錢....然而并不長記性, 這回買完了, 看完了, 又丟到一邊...下次還是得再買...

?

Java中實例化一個對象 vs 小明買一本書

在Java中的實例化一個對象, 就像是在買一本書, Java中的對象會隨著作用域的退出, 對象會失去引用, 過后就會被垃圾收集器標記, 進行回收.

就相當于小明買完了一本書, 書就丟到了一邊, 媽媽收拾屋子就把這本書識別為了垃圾, 就給扔掉了. (被媽媽收走是被動導致的小明每次都重新買一本書, 也有可能小明主動地每次看書都重新買一本, 有錢任性...這種有錢人性的行為在編程語言里就是每次都new一個對象, 而從來不去考慮復用)

?

Java中把對象放進一個容器里進行維護 vs 小明看完書把書放到書架上 (下面的相同顏色表示相同的行為, 可以互相對照)

在Java中:? ?使用完一個臨時實例化的對象后, 如果以后還想復用, 那么就可以放到一個容器里(對象管理器), 或者更直接的說就比如存到一個HashMap里, 需要用的時候以后從里面直接出來. 這樣HashMap對實例化的對象持有引用, 就不會被GC了, 這樣該對象就可以常駐內存, 可以復用了, 不用再實例化同樣的一個對象了.

小明:? ? 看完了一本書, 把書放到了書架上, 這樣媽媽就知道這本書是小明需要的東西, 就不會把它當成垃圾來處理. 這樣這本書就會一直在家里存在, 小明想看的時候, 就到家里的書架就可以看了, 不用再重新買同樣的一本書了.

?

BooK接口

書的統一定義.書在本里子中是享元模式里被共享的對象. 應該被放到書架上復用, 而不是買次都重新買.

/*** 書的統一抽象, 書可以被讀*/
public interface Book {void read();
}

HeadFirstJavaScript類

/*** <<HeadFirst JavaScript>>*/
public class HeadFirstJavaScript implements Book {@Overridepublic void read() {System.out.printf("這是一本<<HeadFirst JavaScript>>. (書的編號是:%s)\n", System.identityHashCode(this));}
}

KotlinInAction類

/*** <<Kotlin實戰>>*/
public class KotlinInAction implements Book {@Overridepublic void read() {System.out.printf("這是一本<<Kotlin實戰>>. (書的編號是:%s)\n", System.identityHashCode(this));}
}

PythonCookBook類

/*** <<Python編程手冊>>*/
public class PythonCookBook implements Book {@Overridepublic void read() {System.out.printf("這是一本<<Python編程手冊>>. (書的編號是:%s)\n", System.identityHashCode(this));}
}

BookFactory類

import java.util.EnumMap;
import java.util.Map;public class BookFactory {public enum BookType {PYTHON, JAVASCRIPT, KOTLIN}private final Map<BookType, Book> shelf;public BookFactory() {shelf = new EnumMap<>(BookType.class);}/*** 想讀一本書的話就通過這里來get.* 如果書架里有, 那么就從書架里拿* 如果書架里沒有, 那么就從書店買一本看, 然后放到書架上*/public Book getBook(BookType type) {Book book = shelf.get(type);if (book == null) {switch (type) {case PYTHON:book = new PythonCookBook();shelf.put(type, book);break;case JAVASCRIPT:book = new HeadFirstJavaScript();shelf.put(type, book);break;case KOTLIN:book = new KotlinInAction();shelf.put(type, book);break;default:break;}}return book;}
}

Main

運行/模擬場景

public class Main {public static void main(String[] args) {BookFactory bookFactory = new BookFactory();bookFactory.getBook(BookFactory.BookType.JAVASCRIPT).read();bookFactory.getBook(BookFactory.BookType.JAVASCRIPT).read();bookFactory.getBook(BookFactory.BookType.PYTHON).read();bookFactory.getBook(BookFactory.BookType.PYTHON).read();bookFactory.getBook(BookFactory.BookType.KOTLIN).read();bookFactory.getBook(BookFactory.BookType.KOTLIN).read();bookFactory.getBook(BookFactory.BookType.KOTLIN).read();// 書的編號一樣, 說明書復用了, 而不是每次都買一個新的}
}

?結果如下 :?

如果對象不是共享的, 也就是非享元模式, 那么<<Kotlin實戰>>的三次的書編號都會是不一樣的, 因為每次看這本書, 都是新買的, 最終會導致買三次<<Kotlin實戰>>這本書, 同樣的書買三次多浪費啊.? 而本文的例子使用了享元模式, 拿了三次<<Kotlin實戰>>這本書, 每次編號都是1360875712, 說明從頭到尾都是同一本書, 沒有造成浪費.

轉載于:https://www.cnblogs.com/noKing/p/9072910.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250257.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法 --- 回溯法

回溯法 參考 - 劍指Offer 回溯法可以看成蠻力法的升級版,它從解決問題每一步的所有可能選項里系統地選擇出一個可行的解決方案. 回溯法解決的問題的特性: 可以形象地用樹狀結構表示: 節點: 算法中的每一個步驟節點之間的連接線: 每個步驟中的選項,通過每一天連接線,可以到達…

013.Zabbix的Items(監控項)

一 Items簡介 Items是從主機里面獲取的所有數據&#xff0c;可以配置獲取監控數據的方式、取值的數據類型、獲取數值的間隔、歷史數據保存時間、趨勢數據保存時間、監控key的分組等。通常情況下item由key參數組成&#xff0c;如監控項中需要獲取cpu信息&#xff0c;則需要一個對…

Cookie 和 Session的區別

pass 下次再寫轉載于:https://www.cnblogs.com/nieliangcai/p/9073520.html

算法 --- 記一道面試dp算法題

題目: 給定一個數組(長度大于1),如下 let a [1,4,3,4,5] // 長度不確定,數值為整數要求寫一個函數,返回該數組中,除本身數字之外其他元素的成積.即返回如下: // 過程[4*3*4*5, 1*3*4*5, 1*4*4*5, 1*4*3*5, 1*4*3*4] // 結果[240, 60, 80, 60, 48]題目要求不使用除法,且時間…

編碼

一、什么是編碼&#xff1f;首先&#xff0c;我們從一段信息即消息說起&#xff0c;消息以人類可以理解、易懂的表示存在。我打算將這種表示稱為“明文”&#xff08;plain text&#xff09;。對于說英語的人&#xff0c;紙張上打印的或屏幕上顯示的英文單詞都算作明文。其次&a…

ASP.NET MVC 實現頁落網資源分享網站+充值管理+后臺管理(10)之素材管理

源碼下載地址&#xff1a;http://www.yealuo.com/Sccnn/Detail?KeyValuec891ffae-7441-4afb-9a75-c5fe000e3d1c 素材管理模塊也是我們這個項目的核心模塊&#xff0c;里面的增刪查改都跟文章管理模塊相同或者相似&#xff0c;唯一不同點可能是對附件的上傳處理&#xff0c;但…

javascript --- [express+ vue2.x + elementUI]登陸的流程梳理

說明 涉及到以下知識點: 登陸的具體流程express、vue2.x、elementUI、axios、jwt、assert 登陸方面的API使用中間件的使用前后端通過http狀態碼,進行響應的操作(這里主要是401)密碼驗證(bcrypt的hashSync方法對明文密碼進行加密,compareSync方法對加密的密碼進行驗證)token的…

設計模式---裝飾模式

今天學習了裝飾模式&#xff0c;做個筆記。。裝飾模式的基礎概念可以參考&#xff1a;https://blog.csdn.net/cjjky/article/details/7478788 這里&#xff0c;就舉個簡單例子 孫悟空有72變&#xff0c;但是它平時是猴子&#xff0c;遇到情況下&#xff0c;它可以變成蝴蝶等等 …

springMvc 注解@JsonFormat 日期格式化

1&#xff1a;一定要加入依賴,否則不生效&#xff1a; <!--日期格式化依賴--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version>&…

Git很簡單--圖解攻略

Git Git 是目前世界上最先進的分布式版本控制系統&#xff08;沒有之一&#xff09;作用 源代碼管理為什么要進行源代碼管理? 方便多人協同開發方便版本控制Git管理源代碼特點 1.Git是分布式管理.服務器和客戶端都有版本控制能力,都能進行代碼的提交、合并、. 2.Git會在根…

css --- 使用scss生成常用的基本css樣式

"工具樣式"的概念和 SASS(SCSS) 在webpack中使用sass 安裝sass和sass-loader $ npm i sass sass-loader由于使用了腳手架,安裝完畢后重啟前端即可 樣式重置 其實就是樣式的初始化 // reset* {box-sizing: border-box; // 以邊框為準. css3盒模型outline: none;…

vc/vs開發的應用程序添加dump崩潰日志轉

原貼地址&#xff1a;https://blog.csdn.net/wangkui1331/article/details/78029940 vc/vs開發的應用程序出現崩潰的時候&#xff0c;由于沒有任何記錄&#xff0c;導致開發人員很難追蹤&#xff0c;但是添加dump文件后&#xff0c;就可以免除這些煩惱 1.添加方法 &#xff08;…

51 nod 1127最短的包含字符串(尺取法)

1127 最短的包含字符串 收藏關注給出一個字符串&#xff0c;求該字符串的一個子串S&#xff0c;S包含A-Z中的全部字母&#xff0c;并且S是所有符合條件的子串中最短的&#xff0c;輸出S的長度。如果給出的字符串中并不包括A-Z中的全部字母&#xff0c;則輸出No Solution。Input…

Java --- 基礎學習Ⅰ

第一章 開發前言 位、字節 位(bit): 一個數字0或一個數字1,代表一位 字節(Byte): 每逢8位是一個字節,這時數據存儲的最小單位 1 Byte 8 bit 1 KB 1024 Byte 1 MB 1024 KB 1 GB 1024 MB 1 TB 1024 GB 1 PB 1024 TB MS-DOS(Microsoft Disk Operating System) 第二章 Ja…

JSON 數據重復 出現$ref

JSONArray 類型 如果我們往里面add數據的時候 如果數據相同&#xff0c;那么就會被替換成 $ref: 也就是被簡化了 因為數據一樣所直接 指向上一條數據 循環引用&#xff1a;當一個對象包含另一個對象時&#xff0c;fastjson就會把該對象解析成引用。引用是通過$ref標示的&am…

Java --- 基礎學習Ⅱ

繼承 繼承概述 下面有一個學生類 public class Student{private String name;private int age;public void study(){System.out.println("努力學習了");}public String getName() {return name;}public void setName(String name) {this.name name;}public int g…

urllib庫

python內置的最基本的HTTP請求庫&#xff0c;有以下四個模塊&#xff1a; urllib.request  請求模塊 urllib.error    異常處理模塊 urllib.parse   url解析模塊 urllib.robotparser robots.txt解析模塊 urllib.request請求模塊&#xff1a; urllib.request.urlopen(u…

layer的刪除詢問框的使用

刪除是個很需要謹慎的操作 我們需要進行確認 對了刪除一般使用ajax操作 因為如果同url請求 處理 再返回 會有空白頁 1.js自帶的樣式 <button type"button" data-toggle"tooltip" title"刪除" class"btn btn-danger pull-right btn-xs&qu…

文獻筆記(八)

一、基本信息 標題&#xff1a;MySQL數據庫在自動測試系統中的應用 時間&#xff1a;2017 出版源&#xff1a;寧夏職業技術學院 領域分類&#xff1a;無線互聯科技 二、研究背景 問題定義&#xff1a;文章介紹了MySQL數據庫的特點&#xff0c;結合自動測試系統運行中的實際&…

Java --- 常用API

常用API 方法重載: 方法名相同,方法接收的參數不同 static: 修飾的類,可以直接使用類名進行調用 方法名說明public static abs(int a)返回參數的絕對值public static double ceil(double a)返回大于或等于public static double floor(double a)返回小于或等于參數的最大doubl…