首頁 >後端開發 >Golang >Go 設計模式#Builder

Go 設計模式#Builder

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-12 06:18:02267瀏覽

Go Design Patterns #Builder

建設者

建構器模式是一種創造性的設計模式,它為逐步建立複雜物件提供了靈活的解決方案。它允許您使用相同的建構過程來建立物件的不同表示。

問題陳述

  • 當建立一個物件涉及多個步驟或參數時,管理建置過程可能會變得很麻煩。
  • 您希望避免「伸縮建構子」問題(建構函式採用許多參數)並確保您的物件在建立後不可變。

建構器模式的好處

  • 靈活性:輕鬆建構物件的不同表示。
  • 可讀性:方法鍊式讓建構過程清晰簡潔。
  • 封裝:建構邏輯封裝在建構器中,與客戶端程式碼分離。

現實世界的例子

考慮建造一台計算機。電腦可以有各種元件,如 CPU、RAM、儲存等。

建構器模式不需要在建構函式中要求所有這些參數,而是允許您逐步設定每個元件。

執行

package main

import "fmt"

// Product
type Computer struct {
    CPU     string
    RAM     string
    Storage string
    OS      string
}

// Builder Interface
type ComputerBuilder interface {
    SetCPU(cpu string) ComputerBuilder
    SetRAM(ram string) ComputerBuilder
    SetStorage(storage string) ComputerBuilder
    SetOS(os string) ComputerBuilder
    Build() *Computer
}

// Concrete Builder
type PCBuilder struct {
    computer *Computer
}

func NewPCBuilder() *PCBuilder {
    return &PCBuilder{&Computer{}}
}

func (b *PCBuilder) SetCPU(cpu string) ComputerBuilder {
    b.computer.CPU = cpu
    return b
}

func (b *PCBuilder) SetRAM(ram string) ComputerBuilder {
    b.computer.RAM = ram
    return b
}

func (b *PCBuilder) SetStorage(storage string) ComputerBuilder {
    b.computer.Storage = storage
    return b
}

func (b *PCBuilder) SetOS(os string) ComputerBuilder {
    b.computer.OS = os
    return b
}

func (b *PCBuilder) Build() *Computer {
    return b.computer
}

// Client Code
func main() {
    builder := NewPCBuilder()

    computer := builder.
        SetCPU("Intel i7").
        SetRAM("16GB").
        SetStorage("1TB SSD").
        SetOS("Windows 7").
        Build()

    fmt.Printf("Computer built: %+v\n", computer)
}

產品(電腦):表示將使用各種屬性建構的複雜物件。

Builder 介面(ComputerBuilder):定義設定產品每個元件的方法。

具體建構器(PCBuilder):實作建構器介面。

  • 提供設定CPU、RAM、儲存和作業系統的方法,返回建構器本身以進行方法連結。
  • Build() 方法傳回最終的 Computer 物件。

客戶端程式碼:建立一個新的建構器實例。

  • 使用方法鏈逐步配置計算機。
  • 呼叫 Build() 來檢索最終產品。

以上是Go 設計模式#Builder的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn