Go設計模式之生成器模式詳細講解
生成器模式
生成器是一種創建型設計模式, 使你能夠分步驟創建復雜對象。
與其他創建型模式不同, 生成器不要求產品擁有通用接口。 這使得用相同的創建過程生成不同的產品成為可能。
概念示例
當所需產品較為復雜且需要多個步驟才能完成時, 也可以使用生成器模式。 在這種情況下, 使用多個構造方法比僅僅使用一個復雜可怕的構造函數更簡單。 分為多個步驟進行構建的潛在問題是, 構建不完整的和不穩定的產品可能會被暴露給客戶端。 生成器模式能夠在產品完成構建之前使其處於私密狀態。
在下方的代碼中, 我們可以看到 iglooBuilder冰屋生成器與 normalBuilder普通房屋生成器可建造不同類型房屋, 即 igloo冰屋和 normalHouse普通房屋 。 每種房屋類型的建造步驟都是相同的。 主管 (可選) 結構體可對建造過程進行組織。
iBuilder.go: 生成器接口
package main type IBuilder interface { setWindowType() setDoorType() setNumFloor() getHouse() House } func getBuilder(builderType string) IBuilder { if builderType == "normal" { return newNormalBuilder() } if builderType == "igloo" { return newIglooBuilder() } 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, } }
iglooBuilder.go: 具體生成器
package main type IglooBuilder struct { windowType string doorType string floor int } func newIglooBuilder() *IglooBuilder { return &IglooBuilder{} } func (b *IglooBuilder) setWindowType() { b.windowType = "Snow Window" } func (b *IglooBuilder) setDoorType() { b.doorType = "Snow Door" } func (b *IglooBuilder) setNumFloor() { b.floor = 1 } func (b *IglooBuilder) getHouse() House { return House{ doorType: b.doorType, windowType: b.windowType, floor: b.floor, } }
house.go: 產品
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") iglooBuilder := getBuilder("igloo") 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(iglooBuilder) iglooHouse := director.buildHouse() fmt.Printf("\nIgloo House Door Type: %s\n", iglooHouse.doorType) fmt.Printf("Igloo House Window Type: %s\n", iglooHouse.windowType) fmt.Printf("Igloo House Num Floor: %d\n", iglooHouse.floor) }
output.txt: 執行結果
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
到此這篇關於Go設計模式之生成器模式詳細講解的文章就介紹到這瞭,更多相關Go生成器模式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Go語言中函數可變參數(Variadic Parameter)詳解
- 詳解Golang中字符串的使用
- 詳解Go語言Slice作為函數參數的使用
- Go語言快速入門指針Map使用示例教程
- Java 深入理解創建型設計模式之建造者模式