Builder デザイン パターンは、複雑なオブジェクトを段階的に構築するために使用され、同じ構築プロセスを使用してオブジェクトのさまざまな表現を作成できます。この記事では、Golang で Builder パターンを実装する方法を検討し、その利点を理解し、実際の使用例を分析します。
ビルダー パターンは、複雑なオブジェクトの構築をその表現から分離し、同じ構築プロセスで異なる表現を作成できるようにします。これは、オブジェクトを複数の手順で作成する必要がある場合、または複数の可能な構成を使用して作成する必要がある場合に特に便利です。
ビルダーを実装するには、複数のフィールドや他のグループ化されたオブジェクトを初期化する必要がある複雑なオブジェクトを想像してみましょう。家はどうですか?ここでは、コンクリートとレンガを使用する従来型の建設と、木造で建設する 2 つのタイプの建設が行われます。
まず、構築したいオブジェクトの構造を定義する必要があります。先ほども言いましたが、家を建てることになりました。この構造体の中に、構造体の作成に必要なものを配置します。
// house.go package main type House struct { Foundation string Structure string Roof string Interior string }
同じファイル内で、家のさまざまな部分を構築するために必要なメソッドを指定するビルダーのインターフェイスを定義します。
//house.go package main type House struct { Foundation string Structure string Roof string Interior string } type HouseBuilder interface { SetFoundation() SetStructure() SetRoof() SetInterior() GetHouse() House }
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 }
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 }
最後に、ディレクターとコンクリートビルダーを使用して、さまざまなタイプの家を建設します。
//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) }
ビルダー パターンは、複雑なオブジェクトを段階的かつ柔軟な方法で構築するためのツールです。 Golang では、このパターンの実装は直接的かつ効果的であり、モジュール式で保守が容易なシステムの作成が可能になります。具体的なインターフェイスとクラスを使用することで、構築ロジックを一元化し、新しい要件の出現に応じたコードの進化を簡素化できます。
以上がビルダーのデザインパターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。