建造者模式

概念

建造者模式(Builder Pattern)講將一個(gè)復(fù)雜的對(duì)象的構(gòu)建與它的表示分離, 使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示奶赔。 使用多個(gè)簡(jiǎn)單的對(duì)象一步一步構(gòu)建成一個(gè)復(fù)雜的對(duì)象弦叶。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式符喝,它提供了一種創(chuàng)建對(duì)象的最佳方式

具體實(shí)現(xiàn)是:比如:構(gòu)建一個(gè)產(chǎn)品

  1. 產(chǎn)品招狸, 2個(gè)內(nèi)部部件兄世, 產(chǎn)品有添加部件的方法啼辣。
  2. 有一個(gè)抽象的構(gòu)建接口, 接口分為2個(gè)接口碘饼, 可以被具體的構(gòu)建者實(shí)現(xiàn)。
  3. 有一個(gè)構(gòu)建指揮者悲伶, 它來做具體的構(gòu)建艾恼, 它繼承了構(gòu)建接口, 接收具體的創(chuàng)建者麸锉, 通過自己的構(gòu)建接口钠绍, 調(diào)用具體創(chuàng)建者的創(chuàng)建方法。
  4. 有兩個(gè)具體的創(chuàng)建接口實(shí)現(xiàn)者花沉, 它包含產(chǎn)品結(jié)構(gòu)體柳爽, 構(gòu)建接口要調(diào)用產(chǎn)品接口, 給具體的產(chǎn)品裝配碱屁。
  5. 具體創(chuàng)建者接口實(shí)現(xiàn)者磷脯,傳遞給創(chuàng)建指揮者, 構(gòu)建了產(chǎn)品以后娩脾, 具體實(shí)現(xiàn)者可以調(diào)用自身獲取產(chǎn)品赵誓, 展示產(chǎn)品。

UML圖

<img src="doc/builder_pattern.jpeg"/>


builder_pattern.png

模式的場(chǎng)景和優(yōu)缺點(diǎn)

使用場(chǎng)景

1柿赊、用于創(chuàng)建一些復(fù)雜的對(duì)象俩功, 這些對(duì)象內(nèi)部構(gòu)建的順序是穩(wěn)定的, 對(duì)象內(nèi)部構(gòu)建通常面臨著復(fù)雜的變化碰声。

2诡蜓、需要生成的對(duì)象內(nèi)部屬性本身相互依賴

優(yōu)點(diǎn)

1、建造者獨(dú)立胰挑,易擴(kuò)展

2蔓罚、便于控制細(xì)節(jié)風(fēng)險(xiǎn)

缺點(diǎn)

1、產(chǎn)品必須有共同點(diǎn)瞻颂,范圍有限制

2脚粟、如內(nèi)部變化復(fù)雜,會(huì)有很多的建造類

代碼實(shí)現(xiàn)


package main

import "fmt"

//Builder 是生成器接口
type Builder interface {
    BuildPart1()
    BuildPart2()
}

// Director ...
type Director struct {
    builder Builder
}

// NewDirector ... 構(gòu)建指揮者
func NewDirector(builder Builder) *Director {
    return &Director{
        builder: builder,
    }
}

// Construct Product 指揮者蘸朋,指揮不同的Build組裝Product
func (d *Director) Construct() {
    d.builder.BuildPart1()
    d.builder.BuildPart2()
}

type Product struct {
    part1 string
    part2 string
}

func (p *Product) AddPart1(part string) {
    p.part1 = part
}
func (p *Product) AddPart2(part string) {
    p.part2 = part
}

func (p *Product) ShowProduct() {
    fmt.Println("Product part1:", p.part1, "part2:", p.part2)
}

// ConcreteBuilder1 ...
type ConcreteBuilder1 struct {
    Product
}

// BuildPart1 ...
func (b *ConcreteBuilder1) BuildPart1() {
    b.Product.AddPart1("部件1")
}

// BuildPart2 ...
func (b *ConcreteBuilder1) BuildPart2() {
    b.Product.AddPart2("部件2")
}

// GetResult ...
func (b *ConcreteBuilder1) GetProduct() Product {
    return b.Product
}

// ContreteBuilder2 ...
type ContreteBuilder2 struct {
    Product
}

// BuildPart1 ...
func (b *ContreteBuilder2) BuildPart1() {
    b.Product.AddPart1("部件a")
}

// BuildPart2 ...
func (b *ContreteBuilder2) BuildPart2() {
    b.Product.AddPart2("部件b")
}

// GetResult ...
func (b *ContreteBuilder2) GetProduct() Product {
    return b.Product
}

func main() {
    b1 := &ConcreteBuilder1{}
    b2 := &ContreteBuilder2{}
    d1 := NewDirector(b1)
    d2 := NewDirector(b2)
    d1.Construct()
    d2.Construct()
    fmt.Println(b1.GetProduct())
    fmt.Println(b2.GetProduct())

}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末核无,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子藕坯,更是在濱河造成了極大的恐慌团南,老刑警劉巖噪沙,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吐根,居然都是意外死亡正歼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門拷橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來局义,“玉大人,你說我怎么就攤上這事冗疮√汛剑” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵术幔,是天一觀的道長(zhǎng)另萤。 經(jīng)常有香客問我,道長(zhǎng)诅挑,這世上最難降的妖魔是什么四敞? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮拔妥,結(jié)果婚禮上忿危,老公的妹妹穿的比我還像新娘。我一直安慰自己没龙,他們只是感情好癌蚁,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兜畸,像睡著了一般努释。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咬摇,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天伐蒂,我揣著相機(jī)與錄音,去河邊找鬼肛鹏。 笑死逸邦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的在扰。 我是一名探鬼主播缕减,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼芒珠!你這毒婦竟也來了桥狡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裹芝,沒想到半個(gè)月后部逮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫂易,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年兄朋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怜械。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颅和,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缕允,到底是詐尸還是另有隱情峡扩,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布灼芭,位于F島的核電站有额,受9級(jí)特大地震影響般又,放射性物質(zhì)發(fā)生泄漏彼绷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一茴迁、第九天 我趴在偏房一處隱蔽的房頂上張望寄悯。 院中可真熱鬧,春花似錦堕义、人聲如沸猜旬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洒擦。三九已至,卻和暖如春怕膛,著一層夾襖步出監(jiān)牢的瞬間熟嫩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工褐捻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掸茅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓柠逞,卻偏偏與公主長(zhǎng)得像昧狮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子板壮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • ? 對(duì)于工廠模式,個(gè)人學(xué)習(xí)需要掌握 注意答案的重點(diǎn)標(biāo)黑了慕购。對(duì)于工廠模式聊疲、建造者模式,掌握沪悲,我下面這幾點(diǎn)就很棒棒获洲。 ...
    一樂樂閱讀 170評(píng)論 0 0
  • 概述 將一個(gè)復(fù)雜對(duì)象的構(gòu)建與表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示 建造者模式分離了部件的構(gòu)造(有Buil...
    開荒者閱讀 291評(píng)論 0 0
  • 前言 建造者模式(Bulider Pattern)是將一個(gè)復(fù)雜對(duì)象的構(gòu)建過程與它的實(shí)現(xiàn)表示分離殿如,使得同樣的構(gòu)建過程...
    碼農(nóng)人生閱讀 147評(píng)論 0 0
  • 一. 概述 建造者模式(Builder)贡珊,又叫生成器模式,它將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離涉馁,使得同樣的構(gòu)建過程...
    BrightLoong閱讀 329評(píng)論 0 0
  • 什么是建造者模式 建造者模式又叫生成器模式, 是一種對(duì)象構(gòu)建模式 可以將復(fù)雜對(duì)象的構(gòu)建過程抽象出來, 使這個(gè)抽象過...
    iDevOps閱讀 553評(píng)論 0 1