1. 程式人生 > 其它 >建立型:二. 生成器模式

建立型:二. 生成器模式

生成器模式是什麼

生成器模式也叫做建造者模式,是一種建立型的設計模式, 使你能夠分步驟建立複雜物件。

為什麼要用生成器模式

假設有這樣一個複雜物件, 在對其進行構造時需要對諸多成員變數和巢狀物件進行復雜的初始化工作。這些初始化程式碼通常深藏於一個包含眾多引數且讓人基本看不懂的建構函式中。而且在很多時候的程式呼叫中只需要少部分的成員引數。這個時候如果我們寫一個複雜的建構函式不僅不利於維護,而且很多成員引數用不到是一種浪費。

生成器模式怎麼實現

首先是我們的目標即:建立的具體的產品,然後我們寫兩個具體的生成器來實現這個產品,最後是生成器介面來抽象實現的方法。

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
}

優點

  1. 你可以分步建立物件, 或暫緩建立步驟。
  2. 可以更加精細地控制產品的建立過程。將複雜產品的建立步驟分解在不同的方法中,使得建立過程更加清晰,也更方便使用程式來控制建立過程。
  3. 具體的建造者相互獨立,因此可以對建造的過程逐步細化,而不會對其他模組產生任何影響。

缺點

  1. 建造者模式所建立的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。
  2. 如果產品內部發生變化 , 建造者也要相應修改。