Назад к вопросам
Junior
128
questionbank

С какими паттернами проектирования вы знакомы?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  • Порождающие: Создают объекты.
    • Фабричный метод
    • Абстрактная фабрика
    • Строитель
    • Прототип
    • Одиночка
  • Структурные: Формируют структуры классов и объектов.
    • Адаптер
    • Мост
    • Компоновщик
    • Декоратор
    • Фасад
    • Приспособленец (Flyweight)
    • Заместитель (Proxy)
  • Поведенческие: Определяют алгоритмы и способы взаимодействия объектов.
    • Цепочка обязанностей
    • Команда
    • Итератор
    • Посредник
    • Снимок (Memonto)
    • Наблюдатель
    • Состояние
    • Стратегия
    • Шаблонный метод
    • Посетитель

В моей практике часто использую Фабричный метод для создания объектов по заданным критериям, Строитель для пошагового конструирования сложных объектов, Одиночку для уникальных экземпляров, Адаптер для совместимости интерфейсов, Декоратор для расширения функциональности, Фасад для упрощения интерфейса подсистемы, Наблюдатель для реализации реактивных систем и Стратегию для выбора алгоритма.

Пример паттерна "Фабричный метод" в Golang:

package main

import "fmt"

type Vehicle interface {
	Drive()
}

type Car struct{}

func (c Car) Drive() {
	fmt.Println("Driving a car")
}

type Bike struct{}

func (b Bike) Drive() {
	fmt.Println("Riding a bike")
}

func NewVehicle(vehicleType string) Vehicle {
	switch vehicleType {
	case "car":
		return Car{}
	case "bike":
		return Bike{}
	default:
		return nil
	}
}

func main() {
	car := NewVehicle("car")
	bike := NewVehicle("bike")

	car.Drive()
	bike.Drive()
}

Пример паттерна "Декоратор" в Golang:

package main

import "fmt"

type Coffee interface {
	Cost() float64
	Description() string
}

type SimpleCoffee struct{}

func (s SimpleCoffee) Cost() float64 {
	return 1.0
}

func (s SimpleCoffee) Description() string {
	return "Simple Coffee"
}

type MilkDecorator struct {
	coffee Coffee
}

func (m MilkDecorator) Cost() float64 {
	return m.coffee.Cost() + 0.5
}

func (m MilkDecorator) Description() string {
	return m.coffee.Description() + ", Milk"
}

type SugarDecorator struct {
	coffee Coffee
}

func (s SugarDecorator) Cost() float64 {
	return s.coffee.Cost() + 0.2
}

func (s SugarDecorator) Description() string {
	return s.coffee.Description() + ", Sugar"
}

func main() {
	coffee := SimpleCoffee{}
	milkCoffee := MilkDecorator{coffee: coffee}
	milkSugarCoffee := SugarDecorator{coffee: milkCoffee}

	fmt.Printf("Cost: %.2f, Description: %s\n", milkSugarCoffee.Cost(), milkSugarCoffee.Description())
}

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