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

Go Design Patterns #Abstract Factory

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

Go Design Patterns #Abstract Factory

Абстрактная фабрика — это творческий шаблон проектирования, который позволяет создавать связанные объекты без указания их конкретных классов.

Постановка задачи

Представьте, что вы разрабатываете набор инструментов для графического пользовательского интерфейса, который должен поддерживать несколько стандартов внешнего вида (например, Windows, macOS, Linux). Для каждого стандарта внешнего вида требуется свой набор компонентов пользовательского интерфейса, таких как кнопки, флажки и полосы прокрутки.

Без шаблона «Абстрактная фабрика» вам пришлось бы писать много условного кода для создания этих компонентов на основе текущего стандарта внешнего вида. Этот подход не масштабируем и затрудняет поддержку и расширение кодовой базы.

Используя шаблон «Абстрактная фабрика», вы можете создать интерфейс для создания семейств связанных объектов (например, кнопок, флажков, полос прокрутки) и реализовать этот интерфейс для каждого стандарта внешнего вида. Таким образом, клиентский код может работать с любым стандартом внешнего вида, не зная особенностей создания компонентов.

Реальный пример

Представьте себе мебельную фабрику, которая производит стулья и столы в разных стилях, от классического до современного.

Для каждого стиля требуется свой набор компонентов (например, ножки, спинка, подлокотники) и материалов (например, дерево, металл, пластик).

Выполнение

  • Запустите пример, запустив go run Abstract-factory/main.go.
package main

import "fmt"

// Abstract Factory
type FurnitureFactory interface {
    MakeChair() Chair
    MakeTable() Table
}

func NewFurnitureFactory(style string) (FurnitureFactory, error) {
    if style == "classic" {
        return &Classic{}, nil
    }

    if style == "modern" {
        return &Modern{}, nil
    }

    return nil, fmt.Errorf("Style %s is not supported", style)
}

type Chair struct {
    Name     string
    Material string
}

type Table struct {
    Name     string
    Material string
}

// Concrete Classic Factory
type Classic struct{}

func (a *Classic) MakeChair() Chair {
    return Chair{
        Name:     "Classic Chair",
        Material: "Wood",
    }
}

func (a *Classic) MakeTable() Table {
    return Table{
        Name:     "Classic Table",
        Material: "Wood",
    }
}

// Concrete Modern Factory
type Modern struct{}

func (n *Modern) MakeChair() Chair {
    return Chair{
        Name:     "Modern Chair",
        Material: "Plastic",
    }
}

func (n *Modern) MakeTable() Table {
    return Table{
        Name:     "Modern Table",
        Material: "Plastic",
    }
}

func main() {
    factory, _ := NewFurnitureFactory("classic")

    chair := factory.MakeChair()
    table := factory.MakeTable()

    fmt.Printf("Chair: %s\n", chair.Name)
    fmt.Printf("Table: %s\n", table.Name)

    factory, _ = NewFurnitureFactory("modern")

    chair = factory.MakeChair()
    table = factory.MakeTable()

    fmt.Printf("Chair: %s\n", chair.Name)
    fmt.Printf("Table: %s\n", table.Name)
}

Объяснение

Этот код демонстрирует шаблон «Абстрактная фабрика», создавая мебель (стулья и столы) в разных стилях (классическом и современном). Он определяет интерфейс для создания семейств связанных объектов и конкретных реализаций для каждого стиля, что обеспечивает простоту масштабирования и обслуживания.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/eduardoarndt/go-design-patterns-4-abstract-factory-971?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

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

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

Copyright© 2022 湘ICP备2022001581号-3