Go設(shè)計模式之生成器模式詳細講解
生成器模式
生成器是一種創(chuàng)建型設(shè)計模式, 使你能夠分步驟創(chuàng)建復(fù)雜對象。
與其他創(chuàng)建型模式不同, 生成器不要求產(chǎn)品擁有通用接口。 這使得用相同的創(chuàng)建過程生成不同的產(chǎn)品成為可能。

概念示例
當所需產(chǎn)品較為復(fù)雜且需要多個步驟才能完成時, 也可以使用生成器模式。 在這種情況下, 使用多個構(gòu)造方法比僅僅使用一個復(fù)雜可怕的構(gòu)造函數(shù)更簡單。 分為多個步驟進行構(gòu)建的潛在問題是, 構(gòu)建不完整的和不穩(wěn)定的產(chǎn)品可能會被暴露給客戶端。 生成器模式能夠在產(chǎn)品完成構(gòu)建之前使其處于私密狀態(tài)。
在下方的代碼中, 我們可以看到 iglooBuilder冰屋生成器與 normalBuilder普通房屋生成器可建造不同類型房屋, 即 igloo冰屋和 normalHouse普通房屋 。 每種房屋類型的建造步驟都是相同的。 主管 (可選) 結(jié)構(gòu)體可對建造過程進行組織。
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: 產(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")
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: 執(zhí)行結(jié)果
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設(shè)計模式之生成器模式詳細講解的文章就介紹到這了,更多相關(guān)Go生成器模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用dep 配置golang 開發(fā)環(huán)境的操作方法
下面小編就為大家?guī)硪黄褂胐ep 配置golang 開發(fā)環(huán)境的操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09

