go 生成器模式的具體使用
生成器模式
生成器模式建議將對(duì)象構(gòu)造代碼從產(chǎn)品類中抽取出來(lái), 并將其放在一個(gè)名為生成器的獨(dú)立對(duì)象中。
模型說(shuō)明
- 生成器 (Builder) 接口聲明在所有類型生成器中通用的產(chǎn)品構(gòu)造步驟。
- 具體生成器 (Concrete Builders) 提供構(gòu)造過(guò)程的不同實(shí)現(xiàn)。 具體生成器也可以構(gòu)造不遵循通用接口的產(chǎn)品。
- 產(chǎn)品 (Products) 是最終生成的對(duì)象。 由不同生成器構(gòu)造的產(chǎn)品無(wú)需屬于同一類層次結(jié)構(gòu)或接口。
- 主管 (Director) 類定義調(diào)用構(gòu)造步驟的順序, 這樣你就可以創(chuàng)建和復(fù)用特定的產(chǎn)品配置。
- 客戶端 (Client) 必須將某個(gè)生成器對(duì)象與主管類關(guān)聯(lián)。 一般情況下, 你只需通過(guò)主管類構(gòu)造函數(shù)的參數(shù)進(jìn)行一次性關(guān)聯(lián)即可。 此后主管類就能使用生成器對(duì)象完成后續(xù)所有的構(gòu)造任務(wù)。 但在客戶端將生成器對(duì)象傳遞給主管類制造方法時(shí)還有另一種方式。 在這種情況下, 你在使用主管類生產(chǎn)產(chǎn)品時(shí)每次都可以使用不同的生成器。
優(yōu)缺點(diǎn)
1.優(yōu)點(diǎn)
- 你可以分步創(chuàng)建對(duì)象,暫緩創(chuàng)建步驟或遞歸運(yùn)行創(chuàng)建步驟。
- 生成不同形式的產(chǎn)品時(shí),你可以復(fù)用相同的制造代碼。
- *單一職責(zé)原則:*你可以將復(fù)雜構(gòu)造代碼從產(chǎn)品的業(yè)務(wù)邏輯中分離出來(lái)。
2.缺點(diǎn)
- 由于該模式需要新增多個(gè)類,因此代碼整體復(fù)雜程度會(huì)有所增加。
使用場(chǎng)景
- 使用生成器模式可避免“重疊構(gòu)造函數(shù)(telescoping constructor)”的出現(xiàn)。
- 當(dāng)你希望使用代碼創(chuàng)建不同形式的產(chǎn)品(例如石頭或木頭房屋)時(shí),可使用生成器模式。
- 使用生成器構(gòu)造組合樹或其他復(fù)雜對(duì)象。
參考代碼
使用建造普通房子以及別墅來(lái)模擬
iBuilder.go: 生成器接口
package main type IBuilder interface { setWindowType() setDoorType() setNumFloor() getHouse() House } func getBuilder(builderType string) IBuilder { if builderType == "normal" { return newNormalBuilder() } if builderType == "villa" { return newVillaBuilder() } return nil }
normalBuilder.go: 普通房子生成器
package main type NormalBuilder struct { windowType string doorType string floor int } func newNormalBuilder() *NormalBuilder { return &NormalBuilder{} } func (b *NormalBuilder) setWindowType() { b.windowType = "Wooden Window" } func (b *NormalBuilder) setDoorType() { b.doorType = "Wooden Door" } func (b *NormalBuilder) setNumFloor() { b.floor = 2 } func (b *NormalBuilder) getHouse() House { return House{ doorType: b.doorType, windowType: b.windowType, floor: b.floor, } }
villaBuilder.go: 別墅生成器
package main type VillaBuilder struct { windowType string doorType string floor int } func newVillaBuilder() *VillaBuilder { return &VillaBuilder{} } func (b *VillaBuilder) setWindowType() { b.windowType = "Snow Window" } func (b *VillaBuilder) setDoorType() { b.doorType = "Snow Door" } func (b *VillaBuilder) setNumFloor() { b.floor = 1 } func (b *VillaBuilder) getHouse() House { return House{ doorType: b.doorType, windowType: b.windowType, floor: b.floor, } }
house.go: 房子產(chǎn)品
package main type House struct { windowType string doorType string floor int }
director.go: 主管類
package main type Director struct { builder IBuilder } func newDirector(b IBuilder) *Director { return &Director{ builder: b, } } func (d *Director) setBuilder(b IBuilder) { d.builder = b } func (d *Director) buildHouse() House { d.builder.setDoorType() d.builder.setWindowType() d.builder.setNumFloor() return d.builder.getHouse() }
main.go: 客戶端
package main import "fmt" func main() { normalBuilder := getBuilder("normal") villaBuilder := getBuilder("villa") director := newDirector(normalBuilder) normalHouse := director.buildHouse() fmt.Printf("Normal House Door Type: %s\n", normalHouse.doorType) fmt.Printf("Normal House Window Type: %s\n", normalHouse.windowType) fmt.Printf("Normal House Num Floor: %d\n", normalHouse.floor) director.setBuilder(villaBuilder) villa := director.buildHouse() fmt.Printf("\nIgloo House Door Type: %s\n", villa.doorType) fmt.Printf("Igloo House Window Type: %s\n", villa.windowType) fmt.Printf("Igloo House Num Floor: %d\n", villa.floor) }
output:
Normal House Door Type: Wooden Door
Normal House Window Type: Wooden Window
Normal House Num Floor: 2Igloo House Door Type: Snow Door
Igloo House Window Type: Snow Window
Igloo House Num Floor: 1
到此這篇關(guān)于go 生成器模式的具體使用的文章就介紹到這了,更多相關(guān)go 生成器模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand的常用函數(shù)
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)math和rand中的常用函數(shù),文中的示例代碼講解詳細(xì), 對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,感興趣的小伙伴可以了解一下2022-12-12Go方法簡(jiǎn)單性和高效性的充分體現(xiàn)詳解
本文深入探討了Go語(yǔ)言中方法的各個(gè)方面,包括基礎(chǔ)概念、定義與聲明、特性、實(shí)戰(zhàn)應(yīng)用以及性能考量,文章充滿技術(shù)深度,通過(guò)實(shí)例和代碼演示,力圖幫助讀者全面理解Go方法的設(shè)計(jì)哲學(xué)和最佳實(shí)踐2023-10-10Go檢查結(jié)構(gòu)體中是否存在某個(gè)字段及創(chuàng)建結(jié)構(gòu)體切片或映射
這篇文章主要為大家介紹了Go檢查結(jié)構(gòu)體中是否存在某個(gè)字段及創(chuàng)建結(jié)構(gòu)體切片或映射實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01go語(yǔ)言編程學(xué)習(xí)實(shí)現(xiàn)圖的廣度與深度優(yōu)先搜索
這篇文章主要為大家介紹了go語(yǔ)言編程學(xué)習(xí)實(shí)現(xiàn)圖的廣度與深度優(yōu)先搜索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10Skywalking-go自動(dòng)監(jiān)控增強(qiáng)使用探究
這篇文章主要介紹了Skywalking-go自動(dòng)監(jiān)控增強(qiáng)使用深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01詳解Go語(yǔ)言中獲取文件路徑的不同方法與應(yīng)用場(chǎng)景
在使用?Go?開發(fā)項(xiàng)目時(shí),估計(jì)有不少人遇到過(guò)無(wú)法正確處理文件路徑的問(wèn)題,本文將嘗試從簡(jiǎn)單到復(fù)雜,詳細(xì)介紹?Go?中獲取路徑的不同方法及應(yīng)用場(chǎng)景,希望對(duì)大家有所幫助2024-02-02