「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > ビルダーのデザインパターン

ビルダーのデザインパターン

2024 年 8 月 31 日に公開
ブラウズ:424

Builder Design Pattern

Builder デザイン パターンは、複雑なオブジェクトを段階的に構築するために使用され、同じ構築プロセスを使用してオブジェクトのさまざまな表現を作成できるようにします。この記事では、Golang で Builder パターンを実装する方法を検討し、その利点を理解し、実際の使用例を分析します。

ビルダーとは何ですか?

Builder パターンは、複雑なオブジェクトの構築をその表現から分離し、同じ構築プロセスで異なる表現を作成できるようにします。これは、オブジェクトを複数の手順で作成する必要がある場合、または複数の可能な構成を使用して作成する必要がある場合に特に便利です。

ビルダーのメリット

  • 構築と表現の分離: オブジェクトの構築を最終的な表現から分離できるようにします。
  • 増分構築: 複雑なオブジェクトを増分的かつ段階的に構築できます。
  • コードの再利用: 複数の方法で組み合わせることができる共通のビルド ステップを定義することで、コードの再利用が容易になります。

ビルダーの実装

ビルダーを実装するには、いくつかのフィールドや他のグループ化されたオブジェクトを初期化する必要がある複雑なオブジェクトを想像してみましょう。家はどうですか?ここでは 2 つのタイプの建設が行われます。1 つはコンクリートとレンガが使用される従来型のもの、もう 1 つは木造です。

1 - 構造の定義

まず、構築するオブジェクトの構造を定義する必要があります。先ほども言いましたが、家を建てることになりました。この構造体の中に、構造体の作成に必要なものを配置します。

// house.go

package main

type House struct {
    Foundation string
    Structure  string
    Roof       string
    Interior   string
}

2 - ビルダーインターフェイスの定義

同じファイル内で、家のさまざまな部分を構築するために必要なメソッドを指定するビルダー インターフェイスを定義します。

//house.go

package main

type House struct {
    Foundation string
    Structure  string
    Roof       string
    Interior   string
}

type HouseBuilder interface {
    SetFoundation()
    SetStructure()
    SetRoof()
    SetInterior()
    GetHouse() House
}

3 - ビルダーの具体的な実装

concreteHouse と woodHouse という 2 つの新しいファイルを作成しましょう。これらは、HouseBuilder インターフェイスに従う具象クラスの実装になります。

//concreteHouse.go

package main

type ConcreteHouseBuilder struct {
    house House
}

func (b *ConcreteHouseBuilder) SetFoundation() {
    b.house.Foundation = "Concrete, brick, and stone"
}

func (b *ConcreteHouseBuilder) SetStructure() {
    b.house.Structure = "Wood and brick"
}

func (b *ConcreteHouseBuilder) SetRoof() {
    b.house.Roof = "Concrete and reinforced steel"
}

func (b *ConcreteHouseBuilder) SetInterior() {
    b.house.Interior = "Gypsum board, plywood, and paint"
}

func (b *ConcreteHouseBuilder) GetHouse() House {
    return b.house
}
//woodHouse.go

package main

type WoodHouseBuilder struct {
    house House
}

func (b *WoodHouseBuilder) SetFoundation() {
    b.house.Foundation = "Wooden piles"
}

func (b *WoodHouseBuilder) SetStructure() {
    b.house.Structure = "Wooden frame"
}

func (b *WoodHouseBuilder) SetRoof() {
    b.house.Roof = "Wooden shingles"
}

func (b *WoodHouseBuilder) SetInterior() {
    b.house.Interior = "Wooden panels and paint"
}

func (b *WoodHouseBuilder) GetHouse() House {
    return b.house
}

4 - ディレクターの定義

Director は、オブジェクトの構築を管理し、構築ステップが正しい順序で呼び出されることを保証するクラスです。特定の Builder 実装の詳細については何も知らず、論理的な順序で Builder メソッドを呼び出して最終製品を作成するだけです。

//director.go

package main

type Director struct {
    builder HouseBuilder
}

func (d *Director) Build() {
    d.builder.SetFoundation()
    d.builder.SetStructure()
    d.builder.SetRoof()
    d.builder.SetInterior()
}

func (d *Director) SetBuilder(b HouseBuilder) {
    d.builder = b
}

5 - ビルダーの使用

最後に、ディレクターとコンクリートビルダーを使用して、さまざまなタイプの家を建てます。

//main.go

package main

import (
    "fmt"
)

func main() {
    cb := &builder.ConcreteHouseBuilder{}
    director := builder.Director{Builder: cb}

    director.Build()
    concreteHouse := cb.GetHouse()

    fmt.Println("Concrete House")
    fmt.Println("Foundation:", concreteHouse.Foundation)
    fmt.Println("Structure:", concreteHouse.Structure)
    fmt.Println("Roof:", concreteHouse.Roof)
    fmt.Println("Interior:", concreteHouse.Interior)
    fmt.Println("-------------------------------------------")

    wb := &builder.WoodHouseBuilder{}
    director.SetBuilder(wb)

    director.Build()
    woodHouse := wb.GetHouse()

    fmt.Println("Wood House")
    fmt.Println("Foundation:", woodHouse.Foundation)
    fmt.Println("Structure:", woodHouse.Structure)
    fmt.Println("Roof:", woodHouse.Roof)
    fmt.Println("Interior:", woodHouse.Interior)
}

要するに

  1. Struct House: 構築中の最終製品を表します。
  2. HouseBuilder インターフェイス: 家のさまざまな部分を構築するためのメソッドを定義します。
  3. コンクリートの実装 (ConcreteHouseBuilder および WoodHouseBuilder): HouseBuilder インターフェイスを実装し、特定の構築ステップを定義します。
  4. ディレクター: 構築プロセスを管理し、ステップが正しい順序で呼び出されることを確認します。
  5. メイン機能: Builder パターンを使用してさまざまなタイプの家を建設し、ディレクターを呼び出してプロセスを管理し、最終製品を取得する方法を示します。

結論

Builder パターンは、複雑なオブジェクトを段階的かつ柔軟な方法で構築するためのツールです。 Golang では、このパターンの実装は直接的かつ効果的であり、モジュール式で保守が容易なシステムの作成が可能になります。具体的なインターフェイスとクラスを使用することで、構築ロジックを一元化し、新しい要件が出現したときにコードの進化を簡素化できます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/rflpazini/builder-design-pattern-2hm3?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3