結(jié)構(gòu)型模式:享元模式

文章首發(fā):
結(jié)構(gòu)型模式:享元模式

熱氣球

七大結(jié)構(gòu)型模式之六:享元模式奈梳。

簡(jiǎn)介

姓名 :享元模式

英文名 :Flyweight Pattern

價(jià)值觀 :共享富貴

個(gè)人介紹
Use sharing to support large numbers of fine-grained objects efficiently.
使用共享對(duì)象可有效地支持大量的細(xì)粒度的對(duì)象飞涂。
(來自《設(shè)計(jì)模式之禪》)

你要的故事

還記得筆袋么志珍?可能有人已經(jīng)忘記了西乖,在寫這篇文章之前其實(shí)我也忘了,從初中開始就再也沒用過筆袋驯镊。拿筆袋來講享元模式再適合不過了锅锨。筆袋放各種各樣的筆,今天我們不講別的妆绞,就講蠟筆顺呕。前段時(shí)間在逛公園的時(shí)候,看到一位老師在畫畫括饶,畫的就是蠟筆畫株茶,第一次看到真正的蠟筆畫,真的很震撼图焰,原來蠟筆也可以把景色畫得那么美启盛。當(dāng)時(shí)偷偷拍了一張,看下圖技羔。

image

我們就拿這幅畫來說驰徊,里面畫了草、樹堕阔、路棍厂、山、天空等等超陆。如果沒有用享元模式牺弹,我們可能這樣子實(shí)現(xiàn)浦马。

蠟筆接口。

interface ICrayon {

    void draw(String place);

}

蠟筆张漂。

/**
 * 蠟筆
 */
class Crayon implements ICrayon {

    private String color;

    public Crayon(String color) {
        System.out.println("---新建【" + color + "】蠟筆" );
        this.color = color;
    }

    @Override
    public void draw(String place) {
        System.out.println("用" + this.color + "蠟筆畫" + place);
    }
}

測(cè)試代碼晶默。這幅畫是小明和小紅一起畫,小明畫了草和路航攒,小紅畫了樹和藍(lán)天磺陡。

public class NoFlyweightTest {

    public static void main(String[] args) {
        drawByXiaoMing();
        drawByXiaoHong();
    }

    public static void drawByXiaoMing() {
        ICrayon greenCrayon = new Crayon("綠色");
        greenCrayon.draw("草");

        ICrayon grayCrayon = new Crayon("灰色");
        grayCrayon.draw("路");
    }

    public static void drawByXiaoHong() {
        ICrayon blueCrayon = new Crayon("藍(lán)色");
        blueCrayon.draw("藍(lán)天");

        ICrayon greenCrayon = new Crayon("綠色");
        greenCrayon.draw("樹");
    }

}

打印結(jié)果:
---新建【綠色】蠟筆
用綠色蠟筆畫草
---新建【灰色】蠟筆
用灰色蠟筆畫路
---新建【藍(lán)色】蠟筆
用藍(lán)色蠟筆畫藍(lán)天
---新建【綠色】蠟筆
用綠色蠟筆畫樹

我們發(fā)現(xiàn)小明和小紅都用了綠色蠟筆,而這里新建了 2 次綠色蠟筆漠畜,也就是在整個(gè)作畫過程中币他,小明和小紅并不是共用一套蠟筆,而是各自用一套蠟筆憔狞,在現(xiàn)實(shí)中是沒什么問題的蝴悉,但是在軟件開發(fā)中,如果這種情況出現(xiàn)瘾敢,其實(shí)相當(dāng)于資源浪費(fèi)拍冠,因?yàn)槊總€(gè)蠟筆都會(huì)占用內(nèi)存,可以共用的我們盡量共用簇抵,節(jié)省一些內(nèi)存空間庆杜,特別是出現(xiàn)很多這種可以共享卻沒有共享的對(duì)象時(shí)候。下面我們引入享元模式碟摆。享元模式實(shí)現(xiàn)方法相當(dāng)于我們蠟筆都放在了筆袋晃财,小明和小紅用完就放到筆袋里面,每一種顏色的蠟筆只有一根焦履,也就是他們共用一套蠟筆拓劝。代碼如下所示。

筆袋代碼嘉裤。我們用了 Map 作為容器郑临,如果容器里面沒有想要顏色的蠟筆,則創(chuàng)建新的蠟筆屑宠,并存到容器里厢洞。

/**
 * 筆袋
 */
class CrayonFactory {

    private static Map<String, ICrayon> data = new HashMap<>();

    public static ICrayon getCrayon(String color) {
        if (data.containsKey(color)) {
            return data.get(color);
        }
        ICrayon crayon = new Crayon(color);
        data.put(color, crayon);
        return crayon;
    }

}

測(cè)試代碼。

public class FlyweightTest {

    public static void main(String[] args) {
        drawByXiaoMing();
        drawByXiaoHong();
    }

    public static void drawByXiaoMing() {
        ICrayon greenCrayon = CrayonFactory.getCrayon("綠色");
        greenCrayon.draw("草");

        ICrayon grayCrayon = CrayonFactory.getCrayon("灰色");
        grayCrayon.draw("路");
    }

    public static void drawByXiaoHong() {
        ICrayon blueCrayon = CrayonFactory.getCrayon("藍(lán)色");
        blueCrayon.draw("藍(lán)天");

        ICrayon greenCrayon = CrayonFactory.getCrayon("綠色");
        greenCrayon.draw("樹");
    }
}

打印結(jié)果:
---新建【綠色】蠟筆
用綠色蠟筆畫草
---新建【灰色】蠟筆
用灰色蠟筆畫路
---新建【藍(lán)色】蠟筆
用藍(lán)色蠟筆畫藍(lán)天
用綠色蠟筆畫樹

利用享元模式實(shí)現(xiàn)的結(jié)果典奉,小紅畫樹所用到的綠色蠟筆跟小明畫草的綠色蠟筆一樣躺翻,小紅用到時(shí)并沒有新建綠色蠟筆。

總結(jié)

是不是有一種卫玖,原來這就是享元模式的感覺公你?平時(shí)開發(fā)過程中經(jīng)常見到這種因?yàn)楹芏嘀貜?fù)的對(duì)象,所以利用享元模式來實(shí)現(xiàn)的場(chǎng)景假瞬。享元模式合理提高了對(duì)象的復(fù)用性陕靠,減少了程序的內(nèi)存占用迂尝,還有一個(gè)提高性能的地方就是減少了對(duì)象創(chuàng)建的過程。好了剪芥,收下這個(gè)簡(jiǎn)單的設(shè)計(jì)模式垄开。歡迎關(guān)注公眾號(hào),一起學(xué)習(xí)進(jìn)步税肪。

推薦閱讀

結(jié)構(gòu)型模式:外觀模式

結(jié)構(gòu)型模式:裝飾模式

結(jié)構(gòu)型模式:組合模式

公眾號(hào)后臺(tái)回復(fù)『大禮包』獲取 Java溉躲、Python、IOS 等教程
加個(gè)人微信備注『教程』獲取架構(gòu)師益兄、機(jī)器學(xué)習(xí)等教程

LieBrother
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锻梳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子偏塞,更是在濱河造成了極大的恐慌唱蒸,老刑警劉巖邦鲫,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灸叼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡庆捺,警方通過查閱死者的電腦和手機(jī)古今,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滔以,“玉大人捉腥,你說我怎么就攤上這事∧慊” “怎么了抵碟?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)坏匪。 經(jīng)常有香客問我拟逮,道長(zhǎng),這世上最難降的妖魔是什么适滓? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任敦迄,我火速辦了婚禮,結(jié)果婚禮上凭迹,老公的妹妹穿的比我還像新娘罚屋。我一直安慰自己,他們只是感情好嗅绸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布脾猛。 她就那樣靜靜地躺著,像睡著了一般鱼鸠。 火紅的嫁衣襯著肌膚如雪猛拴。 梳的紋絲不亂的頭發(fā)上喉刘,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音漆弄,去河邊找鬼睦裳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撼唾,可吹牛的內(nèi)容都是我干的廉邑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼倒谷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛛蒙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渤愁,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤牵祟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抖格,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诺苹,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年雹拄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了收奔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滓玖,死狀恐怖坪哄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情势篡,我是刑警寧澤翩肌,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站禁悠,受9級(jí)特大地震影響念祭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绷蹲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一棒卷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祝钢,春花似錦比规、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至疤估,卻和暖如春灾常,著一層夾襖步出監(jiān)牢的瞬間霎冯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工钞瀑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沈撞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓雕什,卻偏偏與公主長(zhǎng)得像缠俺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贷岸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容