建造者模式

一、定義

建造者模式伊脓,將一個復(fù)雜的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示串纺。

二丽旅、模板方法模式結(jié)構(gòu)圖

建造者
角色 類別 說明
Builder 接口或抽象類 抽象的建造者,不是必須的
ConcreateBuilder 具體的建造者 可以有多個「因為每個建造風(fēng)格可能不一樣」
Product 普通的類 具體的產(chǎn)品「即被建造的對象」
Director 導(dǎo)演也叫指揮者 統(tǒng)一指揮建造者去建造目標(biāo)纺棺,導(dǎo)演不是必須的

三榄笙、模式的實現(xiàn)

public class Product {

    private List<String> parts = new ArrayList<>();
    public void addPart(String part) {
        parts.add(part);
    }

    public void showProduct() {
        for (String part : parts) {
            System.out.println(part);
        }
    }
}
public abstract class Builder {

    public abstract void buildPartA();

    public abstract void buildPartB();

    public abstract Product getResult();

}
public class ConcreteBuilderOne extends Builder {

    private Product product = new Product();
    @Override
    public void buildPartA() {
        product.addPart("部件A");
    }

    @Override
    public void buildPartB() {
        product.addPart("部件B");
    }

    @Override
    public Product getResult() {
        return product;
    }
}


public class ConcreteBuilderTwo extends Builder {
    private Product product = new Product();

    @Override
    public void buildPartA() {
        product.addPart("部件A");
    }

    @Override
    public void buildPartB() {
        product.addPart("部件B");
    }

    @Override
    public Product getResult() {
        return product;
    }
}
public class Director {
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
    }
}
public static void main(String[] args) {
        Director director = new Director();
        Builder builderOne = new ConcreteBuilderOne();
        Builder builderTwo = new ConcreteBuilderTwo();

        director.construct(builderOne);
        Product p1 = builderOne.getResult();
        p1.showProduct();

        director.construct(builderTwo);
        Product p2 = builderTwo.getResult();
        p2.showProduct();
    }

四、使用的案例

dubbo 源碼中獲取內(nèi)存cache的一段邏輯就是用了建造者模式祷蝌,接著直接貼上源碼對照著上面的四部分茅撞。
分析:構(gòu)建cache都要先緩存到一個map中去,get的時候先從map獲取巨朦,獲取不到米丘,在構(gòu)建,然后放入map糊啡。整個流程是固定的拄查,只是放入的Cache有多種。

Product

public interface Cache {

    void put(Object key, Object value);

    Object get(Object key);

}

public class LruCache implements Cache {
    
    private final Map<Object, Object> store;

    public LruCache(String url) {
        final int max = 1000;
        //TODO 1 LinkedHashMap可以做成lru格式的
        this.store = new LinkedHashMap<Object, Object>() {
            private static final long serialVersionUID = -3834209229668463829L;
            @Override
            protected boolean removeEldestEntry(Entry<Object, Object> eldest) {
                return size() > max;
            }
        };
    }

    @Override
    public void put(Object key, Object value) {
        synchronized (store) {
            store.put(key, value);
        }
    }

    @Override
    public Object get(Object key) {
        synchronized (store) {
            return store.get(key);
        }
    }

}

Builder

public abstract class AbstractCacheFactory implements CacheFactory {
    
    private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<String, Cache>();

    @Override
    public Cache getCache(String url) {
        String key = url;
        Cache cache = caches.get(key);
        if (cache == null) {
            caches.put(key, createCache(url));
            cache = caches.get(key);
        }
        return cache;
    }

    protected abstract Cache createCache(String url);

}

ConcreteBuliderOne

public class LruCacheFactory extends AbstractCacheFactory {

    @Override
    protected Cache createCache(String url) {
        return new LruCache(url);
    }

}

ConcreteBuliderTwo

public class JCacheFactory extends AbstractCacheFactory {

    protected Cache createCache(URL url) {
        return new JCache(url);
    }

}
Director

public class Director {
    public Cache construct(AbstractCacheFactory abstractCacheFactory) {
       return abstractCacheFactory.getCache("cache");
    }
}

public class Director {
    public Cache construct(AbstractCacheFactory abstractCacheFactory) {
       return abstractCacheFactory.getCache("cache");
    }
}
public static void main(String[] args) {
        Director director = new Director();
        AbstractCacheFactory abstractCacheFactory = new LruCacheFactory();
        Cache cache = director.construct(abstractCacheFactory);
    }

四棚蓄、建造者模式的特點

1堕扶、使創(chuàng)建產(chǎn)品的步驟「把創(chuàng)建產(chǎn)品步驟放在不同的方法中,更加清晰直觀」和產(chǎn)品本身分離梭依,即使用相同的創(chuàng)建過程要吧創(chuàng)建出不同的產(chǎn)品
2稍算、每個建造者都是獨立的互不影響,這樣就達到解耦的目的役拴,所以如果想要替換現(xiàn)有的建造者那非常方便糊探,添加一個實現(xiàn)即可。

所以說河闰,建造者模式實在創(chuàng)建復(fù)雜對象的算法應(yīng)該獨立于該對象的組成部分以及它們的裝配方式是使用的模式科平。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市姜性,隨后出現(xiàn)的幾起案子匠抗,更是在濱河造成了極大的恐慌,老刑警劉巖污抬,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汞贸,死亡現(xiàn)場離奇詭異,居然都是意外死亡印机,警方通過查閱死者的電腦和手機矢腻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來射赛,“玉大人多柑,你說我怎么就攤上這事¢乖穑” “怎么了竣灌?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵聂沙,是天一觀的道長。 經(jīng)常有香客問我初嘹,道長及汉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任屯烦,我火速辦了婚禮坷随,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驻龟。我一直安慰自己温眉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布翁狐。 她就那樣靜靜地躺著类溢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪露懒。 梳的紋絲不亂的頭發(fā)上豌骏,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音隐锭,去河邊找鬼窃躲。 笑死,一個胖子當(dāng)著我的面吹牛钦睡,可吹牛的內(nèi)容都是我干的蒂窒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼荞怒,長吁一口氣:“原來是場噩夢啊……” “哼洒琢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起褐桌,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤衰抑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后荧嵌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呛踊,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年啦撮,在試婚紗的時候發(fā)現(xiàn)自己被綠了谭网。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片般码。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡奥秆,死狀恐怖翎冲,靈堂內(nèi)的尸體忽然破棺而出辛友,到底是詐尸還是另有隱情捌袜,我是刑警寧澤苗缩,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布扶认,位于F島的核電站唇跨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏层坠。R本人自食惡果不足惜殖妇,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窿春。 院中可真熱鬧,春花似錦采盒、人聲如沸旧乞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尺栖。三九已至,卻和暖如春烦租,著一層夾襖步出監(jiān)牢的瞬間延赌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工叉橱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挫以,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓窃祝,卻偏偏與公主長得像掐松,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粪小,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

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

  • 沒有人買車會只買一個輪胎或者方向盤大磺,大家買的都是一輛包含輪胎、方向盤和發(fā)動機等多個部件的完整汽車探膊。如何將這些部件組...
    justCode_閱讀 1,849評論 1 6
  • 模式動機 無論是在現(xiàn)實世界中還是在軟件系統(tǒng)中杠愧,都存在一些復(fù)雜的對象,它們擁有多個組成部分逞壁,如汽車流济,它包括車輪、方向...
    lijun_m閱讀 418評論 0 0
  • 【學(xué)習(xí)難度:★★★★☆腌闯,使用頻率:★★☆☆☆】直接出處:建造者模式梳理和學(xué)習(xí):https://github.com...
    BruceOuyang閱讀 777評論 0 5
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是建造者模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 Builder模式變種 建造者模式...
    w1992wishes閱讀 447評論 0 3
  • 他坐在窗旁賞月袭灯,輕聲吟誦著“在天愿作比翼鳥,在地愿為連理枝绑嘹』”久久沉浸在唐玄宗和楊玉環(huán)的凄苦愛情中。月亮越來越明亮...
    Nelly_1992閱讀 285評論 1 1