常見幾種設計模式之享元模式

目錄
一虎敦、創(chuàng)建型
1.單例模式
2.工廠模式
3.原型模式
二、結構型
1.享元模式
(1)傳統(tǒng)方式(展示網(wǎng)站)
(2)享元模式優(yōu)化
(3)Integer(常量池緩存-128 ~ 127)
(4)總結
2.代理模式
三比规、行為型
1.模板模式
2.職責鏈模式

(1)傳統(tǒng)方式(展示網(wǎng)站)

1.題目:做一個展示網(wǎng)站的產品,客戶端希望以三種方式來發(fā)布

--以新聞的形式
--以博客的形式
--以微信公眾號的形式

2.傳統(tǒng)方法

(1)把一個網(wǎng)站復制拷貝為3份,然后在這個基礎上進行我們的定制化功能(新聞樣式,博客,微信公眾號)
(2)然后用多個虛擬空間來進行顯示
(3)缺點并改進:
--網(wǎng)站相似度很高,網(wǎng)站項目能不能優(yōu)化成重用一個項目,不要拷貝3份重復的,造成多實例對象,浪費系統(tǒng)資源
--展示網(wǎng)站也不是高并發(fā)量的,如果高并發(fā)應該部署在不同的機器上
--整和到一個網(wǎng)站,對于CPU,內存,硬盤,數(shù)據(jù)庫都可以達到共享,減少資源占用

(2)享元模式優(yōu)化

#1.享元(Flyweight Pattern蠅量模式)
(1)運用共享技術有效支持大量細粒度的對象
(2)享元模式舉例: 1.下棋共享棋子 2.數(shù)據(jù)庫連接池 3.方法區(qū)常量池

#2.享元模式分為內部狀態(tài)和外部狀態(tài)
-內部:對象共享出來的信息,可以用hashMap模擬去重效果
-外部:是隨著環(huán)境改變而改變的,不可共享的狀態(tài)(2)圍棋例子
2.1理論上右361個空位可以放棋子庭惜,每個棋盤有兩三百個棋子對象產生距芬,
2.2如果1000萬人直播觀看圍棋比賽,那么產生對象數(shù)量不可估量循帐,單臺服務器很難支持更多粉絲觀看
2.3如果用享元模式處理框仔,棋子對象可以減少到只有到兩個實例(兩個對手)

#3.補充
(1)單例是共享內存呢,享元是通過共享對象來減少重復的對象
image-20201208080146337.png
image-20201208121442037.png

(3)Integer(常量池緩存-128 ~ 127)

#Integer類的valueOf的享元模式
(1)常量池會緩存-128 ~ 127的整型,執(zhí)行速度比new Integer(127)快
(2)如果Integer z = Integer.valueOf(num); num的范圍在緩存范圍內,則會從緩存中取Integer對象,不會new
(3)所以兩個Integer.valueOf(127)返回的對象用==比較地址的時候是相等的,返回true
public static void main(String[] args) {
        Integer x = Integer.valueOf(127);   // 裝箱(valueOf)--得到類型為Integer的x實例
        Integer y = new Integer(127); // 裝箱(new)--得到類型為Integer的x實例
        Integer z = Integer.valueOf(127);
        Integer w = new Integer(127);
        System.out.println(x.equals(y)); // true
        System.out.println(x == y);      // false
        System.out.println(x == z);      // true (常量池會緩存-128 ~ 127的整型)
        System.out.println(w == x);      // false
        System.out.println(w == y);      // false
    }
//Integer.java的源碼
// low ~ high范圍內的緩存
static final int low = -128;
static final int high;
        static final Integer cache[];
        static {int h = 127;
            high = h;
            cache = new Integer[(high - low) + 1];
            for(int k = 0; k < cache.length; k++)
               cache[k] = new Integer(j++);
            ...........
         }

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high) // 在緩存范圍內,則從cache取
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i); // 否則new 一個返回
    }
image-20201208081114850.png

(4)總結

(1)享元模式,"享"代表共享,"元"代表對象,系統(tǒng)中有大量的重復對象,可以使用唯一的標識來標記,比如hashMap,HashTable
(2)優(yōu)點:享元模式減少了對象的創(chuàng)建,減少了內存的占用,提高效率
(3)缺點:提高了系統(tǒng)的復雜度,需要分離出內部狀態(tài)和外部狀態(tài),并且需要工廠類進行控制(工廠類一般只獲得固有共有的部分)
(4)場景:String常量池,數(shù)據(jù)庫連接池,直播圍棋,網(wǎng)站切換不同樣式

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拄养,隨后出現(xiàn)的幾起案子离斩,更是在濱河造成了極大的恐慌,老刑警劉巖瘪匿,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跛梗,死亡現(xiàn)場離奇詭異,居然都是意外死亡棋弥,警方通過查閱死者的電腦和手機核偿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顽染,“玉大人漾岳,你說我怎么就攤上這事》勰” “怎么了尼荆?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唧垦。 經(jīng)常有香客問我捅儒,道長,這世上最難降的妖魔是什么振亮? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任巧还,我火速辦了婚禮,結果婚禮上坊秸,老公的妹妹穿的比我還像新娘狞悲。我一直安慰自己,他們只是感情好妇斤,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布摇锋。 她就那樣靜靜地躺著,像睡著了一般站超。 火紅的嫁衣襯著肌膚如雪荸恕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天死相,我揣著相機與錄音融求,去河邊找鬼。 笑死算撮,一個胖子當著我的面吹牛生宛,可吹牛的內容都是我干的县昂。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼陷舅,長吁一口氣:“原來是場噩夢啊……” “哼倒彰!你這毒婦竟也來了?” 一聲冷哼從身側響起莱睁,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤待讳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仰剿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體创淡,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年南吮,在試婚紗的時候發(fā)現(xiàn)自己被綠了琳彩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡部凑,死狀恐怖汁针,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情砚尽,我是刑警寧澤施无,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站必孤,受9級特大地震影響猾骡,放射性物質發(fā)生泄漏。R本人自食惡果不足惜敷搪,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一兴想、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赡勘,春花似錦嫂便、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至践樱,卻和暖如春厂画,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拷邢。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工袱院, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓忽洛,卻偏偏與公主長得像腻惠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欲虚,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容