設計模式 -- 亨元模式(FlyWeight Pattern)

用來盡可能減少內存使用量,適用于存在大量重復對象的場景,達到對象共享,避免創建過多對象的效果,提升性能,避免內存溢出。

定義:

使用共享對象有效支持大量細粒度對象。

適用場景:

  1. 系統中存在大量相似對象;
  2. 細粒度對象具備接近外部狀態,內部狀態與環境無關;
  3. 需要緩沖池。

亨元模式其實是通過集合來緩沖對象,獲取的時候,先判斷集合里面是否存在該對象,如果有就取出來,沒有創建新的,避免不必要的對象創建。

簡單例子:

接口類:

public interface Ticket {public void showTicketInfo(String bunk);
}

接口實現類:

public class AirTicket implements Ticket {public String from;public String to;public String bunk;public int price;public AirTicket(String from, String to) {this.from = from;this.to = to;}@Overridepublic void showTicketInfo(String bunk) {price = new Random().nextInt(300);System.out.println("從" + from + "到" + to + "的" + bunk + "價格:" + price);}
}

亨元工廠類,創建對象池,創建亨元對象:

public class AirTicketFactory {public static Map<String, Ticket> tickets = new ConcurrentHashMap<String, Ticket>();/*** 亨元模式具體體現,緩沖對象數據,減少對象創建* @param from* @param to* @return*/public static Ticket getTicket(String from, String to) {String key = from + "-" + to;if (tickets.containsKey(key)) {return tickets.get(key);}else {AirTicket airTicket = new AirTicket(from, to);tickets.put(key, airTicket);return airTicket;}}
}

測試類:

public class Main {public static void main(String[] args) {Ticket toXianAirTicket0 = AirTicketFactory.getTicket("深圳", "西安");Ticket toBeiJingAirTicket = AirTicketFactory.getTicket("深圳", "北京");Ticket toXianAirTicket1 = AirTicketFactory.getTicket("深圳", "西安");Ticket toXianAirTicket2 = AirTicketFactory.getTicket("深圳", "西安");toXianAirTicket0.showTicketInfo("頭等艙");toBeiJingAirTicket.showTicketInfo("商務艙");toXianAirTicket1.showTicketInfo("頭等艙");toXianAirTicket2.showTicketInfo("頭等艙");}
}

結果:

從深圳到西安的頭等艙價格:114
從深圳到北京的商務艙價格:215
從深圳到西安的頭等艙價格:231
從深圳到西安的頭等艙價格:103

?

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

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

相關文章

python3.6使用mysql_Python之——Python3.6連接MySQL

只安裝了Python是不能連接數據庫的&#xff0c;還要安裝Python連接MySQL的相關類庫&#xff0c;Python2.7連接MySQL的類庫很多&#xff0c;MySQL官方最新支持的Python為Python3.4.&#xff0c;如下圖所示&#xff1a;那么&#xff0c;在Python3.6上如何實現連接MySQL的功能呢&a…

android解析json

android2.3提供的json解析類 android的json解析部分都在包org.json下&#xff0c;主要有以下幾個類&#xff1a; JSONObject&#xff1a;可以看作是一個json對象 JSONStringer&#xff1a;json文本構建類 JSONArray&#xff1a;可以看作是json的數組 JSONTokener&#xff1a;js…

MVVM模式于MVP模式

MVC、MVP、MVVM這些模式是為了解決開發過程中的實際問題而提出來的&#xff0c;目前作為主流的幾種架構模式而被廣泛使用。 一.MVP模式(Model-View-Presenter):傳統的開發是MVP模式(例如jquery) MVP是把MVC中的Controller換成了Presenter&#xff08;呈現&#xff09;&#xff…

HUNAN 11560 Yangyang loves AC(二分+貪心)

http://acm.hunnu.edu.cn/online/?actionproblem&typeshow&id11560&courseid0 題意&#xff1a;總共有n天,每天yangyang都需要一個快樂值,有m個隊友,每個隊友都會給陽陽一個快樂值(為2的冪),并且只能給一次,如果某一天隊友給的快樂值達到yangyang需要的快樂值那么…

BrowserSync開發利器

2019獨角獸企業重金招聘Python工程師標準>>> 大大節省開發時間。安裝使用簡單。使用步驟&#xff1a; 1、nodejs環境 安裝 2、在項目中使用npm安裝到本項目 3、對要監聽的文件執行響應命令 官網更詳細&#xff1a;http://www.browsersync.cn/#install 原理&#xf…

python字符串解析_Python-字符串解析-正則-re

正則表達式特殊字符序列&#xff0c;匹配檢索和替換文本普通字符 特殊字符 數量&#xff0c;普通字符用來定邊界更改字符思路字符串函數 > 正則 > for循環元字符  匹配一個字符# 元字符大寫&#xff0c;一般都是取小寫的反1. 0~9 整數          \d    …

algorithm -- 選擇排序

選擇排序是《導論》第一章課后習題&#xff0c;仿照插入排序&#xff0c;再次運用循環不變式來證明下算法的正確性&#xff0c;C 源碼&#xff1a; // 交換函數 void swap( int& a, int& b ) {a a^b;b a^b;a a^b; } void selectSort( int *arr, int count ) {if( a…

OD 完美走位

題目描述&#xff1a; 在第一人稱射擊游戲中&#xff0c;玩家通過鍵盤的A、S、D、W四個按鍵控制游戲人物分別向左、向后、向右、向前進行移動&#xff0c;從而完成走位。假設玩家每按動一次鍵盤&#xff0c;游戲人物會向某個方向移動一步&#xff0c;如果玩家在操作一定次數的鍵…

layui upload 后臺獲取不到值

后臺獲取不到值方法一&#xff1a; <script>layui.use(upload, function () {var upload layui.upload;//執行實例var uploadInst upload.render({elem: #test1 //綁定元素, url: /Home/UploadFiles //上傳接口, field: "fileNames" //添加這個屬性與后臺…

ueeditor無法上傳圖片_百度ue文本編輯器開發中無法上傳圖片

第一次發文&#xff0c;好緊張呀&#xff0c;不知道會不會沒人看。之前用ue遇到了一些坑&#xff0c;沒人看就當自己記錄了筆記。第一次用&#xff0c;總是會遇到問題&#xff0c;可以先查看下百度ue的演示http://ueditor.baidu.com/website/onlinedemo.html和API http://fex.b…

SQL 語句優化--IN語句優化案例

為什么80%的碼農都做不了架構師&#xff1f;>>> 今天客戶系統升級&#xff0c;通過DMVs性能分析查了一下&#xff0c;升級后發現一個語句執行時間比較長&#xff0c;執行語句要好幾秒鐘&#xff0c;調出語句如下&#xff1a; select distinct field003 from ufi2j0…

Activity跳轉

本例中MainActivity為&#xff1a;FirstActivity.java FirstActivity如下&#xff1a; package com.wyl.intentmultiactivitytest;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Vie…

Java課程設計---項目數據庫設計(含實體類)

1、數據庫分析設計 將數據庫命名為&#xff1a;db_student 分析系統中各角色之間的關系 2、表設計 &#xff08;1&#xff09;新建表tb_student&#xff08;學生表&#xff09; &#xff08;2&#xff09;新建表tb_admin&#xff08;管理員表&#xff09; &#xff08;3&#x…

java)_Java NIO系列教程(一) Java NIO 概述

原文鏈接 作者&#xff1a;Jakob Jenkov 譯者&#xff1a;airu 校對&#xff1a;丁一Java NIO 由以下幾個核心部分組成&#xff1a;ChannelsBuffersSelectors雖然Java NIO 中除此之外還有很多類和組件&#xff0c;但在我看來&#xff0c;Channel&#xff0c;Buffer…

本地讀取服務器Xml文件及本地讀本地的xml

updateUrl"ServerUrl"(服務器路徑) WebClient wc new WebClient(); Stream stream wc.OpenRead(updateUrl); XmlDocument xmlDoc new XmlDocument(); xmlDoc.Load(stream); XmlNode list xmlDoc.SelectSingleNode("Update"); foreach (XmlNode node in…

Context.getExternalFilesDir()和Context.getExternalCacheDir()方法

2019獨角獸企業重金招聘Python工程師標準>>> Context.getExternalCacheDir()方法可以獲取到 SDCard/Android/data/你的應用包名/cache/目錄&#xff0c;一般存放臨時緩存數據如果使用上面的方法&#xff0c;當你的應用在被用戶卸載后&#xff0c;SDCard/Android/dat…

java 靜態代碼塊_JAVA靜態代碼塊

今天遇到下面的代碼&#xff0c;感覺很奇怪&#xff0c;特意記錄下&#xff1a;代碼如下&#xff1a;public class Test {private static List objs new ArrayList();static {objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT));objs.add(new Test(Test.S_NAME,Test.NAME,…

context詳解

1、Context概念&#xff1a; Context&#xff0c;相信不管是第一天開發Android&#xff0c;還是開發Android的各種老鳥&#xff0c;對于Context的使用一定不陌生~~你在加載資源、啟動一個新的Activity、獲取系統服務、獲取內部文件&#xff08;夾&#xff09;路徑、創建View操作…

Unity Camera的兩種模式

http://www.cnblogs.com/zhaoqingqing/p/3302484.html

mysql之group_concat函數

mysql之group_concat函數 在介紹GROUP_CONCAT之前&#xff0c;我們先來看看concat()函數和concat_ws()函數。 先準備一個測試數據庫&#xff1a; mysql> select * from scores; --------------------- | id | name | score | --------------------- | 1 | zhangsan | 1…