Шаблон проектирования Builder используется для поэтапного построения сложных объектов, позволяя создавать различные представления объекта с использованием одного и того же процесса построения. В этой статье мы рассмотрим, как реализовать паттерн Builder в Golang, поймем его преимущества и разберем практический пример использования.
Шаблон Builder отделяет построение сложного объекта от его представления, позволяя одному и тому же процессу конструирования создавать разные представления. Это особенно полезно, когда объект необходимо создать в несколько этапов или с несколькими возможными конфигурациями.
Чтобы реализовать наш Конструктор, представим себе сложный объект, где нужно будет инициализировать несколько полей и даже другие сгруппированные объекты. Как насчет Дома? Где у нас будет два типа конструкции: обычная, в которой будут использоваться бетон и кирпич, и вторая, деревянная.
Во-первых, нам нужно определить структуру объекта, который мы хотим построить. Как уже было сказано, мы собираемся построить дом. Внутри этой структуры мы поместим все необходимое для ее создания.
// house.go package main type House struct { Foundation string Structure string Roof string Interior string }
Все еще в том же файле мы определим наш интерфейс 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 }
Давайте создадим два новых файла: бетонный дом и деревянный дом. Они будут реализацией конкретного класса, следующего за интерфейсом 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 }
Директор — это класс, который управляет построением объекта, обеспечивая вызов этапов строительства в правильном порядке. Он ничего не знает о деталях конкретных реализаций 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) }
Шаблон Builder — это инструмент для поэтапного и гибкого создания сложных объектов. В Golang реализация этого шаблона является прямой и эффективной, что позволяет создавать модульные и простые в обслуживании системы. Используя конкретные интерфейсы и классы, мы можем централизовать логику построения и упростить эволюцию кода по мере появления новых требований.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3