«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Шаблон проектирования «Строитель»

Шаблон проектирования «Строитель»

Опубликовано 31 августа 2024 г.
Просматривать:334

Builder Design Pattern

Шаблон проектирования Builder используется для поэтапного построения сложных объектов, позволяя создавать различные представления объекта с использованием одного и того же процесса построения. В этой статье мы рассмотрим, как реализовать паттерн Builder в Golang, поймем его преимущества и разберем практический пример использования.

Что такое Строитель?

Шаблон Builder отделяет построение сложного объекта от его представления, позволяя одному и тому же процессу конструирования создавать разные представления. Это особенно полезно, когда объект необходимо создать в несколько этапов или с несколькими возможными конфигурациями.

Преимущества застройщика

  • Разделение конструкции и представления: позволяет отделить конструкцию объекта от его окончательного представления.
  • Поэтапное построение: позволяет создавать сложные объекты постепенно и шаг за шагом.
  • Повторное использование кода: облегчает повторное использование кода, определяя общие этапы сборки, которые можно комбинировать несколькими способами.

Реализация построителя

Чтобы реализовать наш Конструктор, представим себе сложный объект, где нужно будет инициализировать несколько полей и даже другие сгруппированные объекты. Как насчет Дома? Где у нас будет два типа конструкции: обычная, в которой будут использоваться бетон и кирпич, и вторая, деревянная.

1 – Определение структуры

Во-первых, нам нужно определить структуру объекта, который мы хотим построить. Как уже было сказано, мы собираемся построить дом. Внутри этой структуры мы поместим все необходимое для ее создания.

// house.go

package main

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

2. Определение интерфейса конструктора

Все еще в том же файле мы определим наш интерфейс Builder, который определяет методы, необходимые для строительства различных частей дома.

//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. Конкретная реализация Builder

Давайте создадим два новых файла: бетонный дом и деревянный дом. Они будут реализацией конкретного класса, следующего за интерфейсом 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 - Определение директора

Директор — это класс, который управляет построением объекта, обеспечивая вызов этапов строительства в правильном порядке. Он ничего не знает о деталях конкретных реализаций 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 — это инструмент для поэтапного и гибкого создания сложных объектов. В Golang реализация этого шаблона является прямой и эффективной, что позволяет создавать модульные и простые в обслуживании системы. Используя конкретные интерфейсы и классы, мы можем централизовать логику построения и упростить эволюцию кода по мере появления новых требований.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/rflpazini/builder-design-pattern-2hm3?1. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3