生成器模式是什么
生成器模式也叫做建造者模式,是一種創建型的設計模式, 使你能夠分步驟創建復雜物件,
為什么要用生成器模式
假設有這樣一個復雜物件, 在對其進行構造時需要對諸多成員變數和嵌套物件進行復雜的初始化作業,這些初始化代碼通常深藏于一個包含眾多引數且讓人基本看不懂的建構式中,而且在很多時候的程式呼叫中只需要少部分的成員引數,這個時候如果我們寫一個復雜的建構式不僅不利于維護,而且很多成員引數用不到是一種浪費,
生成器模式怎么實作
首先是我們的目標即:創建的具體的產品,然后我們寫兩個具體的生成器來實作這個產品,最后是生成器介面來抽象實作的方法,
house.go: 產品
type house struct {
windowType string
doorType string
floor int
}
ormalBuilder.go: 具體生成器
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: 具體生成器
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,
}
}
iBuilder.go: 生成器介面
type iBuilder interface {
setWindowType()
setDoorType()
setNumFloor()
getHouse() house
}
優點
- 你可以分步創建物件, 或暫緩創建步驟,
- 可以更加精細地控制產品的創建程序,將復雜產品的創建步驟分解在不同的方法中,使得創建程序更加清晰,也更方便使用程式來控制創建程序,
- 具體的建造者相互獨立,因此可以對建造的程序逐步細化,而不會對其他模塊產生任何影響,
缺點
- 建造者模式所創建的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用范圍受到一定的限制,
- 如果產品內部發生變化 , 建造者也要相應修改,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/445591.html
標籤:設計模式
下一篇:創建型:三. 原型模式
