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

Расскажи о паттерне проектирования Фабрика.

Sobes Copilot

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

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

sobes.tech AI

Фабрика (Factory Method) — порождающий паттерн, который определяет интерфейс для создания объектов, но позволяет подклассам решать, какой класс инстанцировать.

Основные компоненты:

  • Продукт (Product): Интерфейс или абстрактный класс, определяющий тип объектов, создаваемых фабричным методом.
  • Конкретный Продукт (Concrete Product): Конкретная реализация Продукта.
  • Создатель (Creator): Класс, объявляющий фабричный метод, возвращающий объект типа Продукт. Он может содержать реализацию по умолчанию для этого метода или оставить его абстрактным.
  • Конкретный Создатель (Concrete Creator): Подкласс Создателя, переопределяющий фабричный метод для создания конкретных Конкретных Продуктов.

Преимущества:

  • Гибкость: Позволяет добавлять новые типы продуктов без изменения кода клиента, использующего фабрику.
  • Слабая связанность: Отделяет код создания объекта от кода его использования.
  • Простота расширения: Добавление нового продукта требует создания нового Конкретного Продукта и Конкретного Создателя.

Пример реализации на Go:

// Продукт
type Shape interface {
	Draw() string
}

// Конкретный Продукт
type Circle struct{}

func (c *Circle) Draw() string {
	return "Drawing a Circle"
}

// Конкретный Продукт
type Square struct{}

func (s *Square) Draw() string {
	return "Drawing a Square"
}

// Создатель
type ShapeFactory interface {
	CreateShape() Shape
}

// Конкретный Создатель
type CircleFactory struct{}

func (cf *CircleFactory) CreateShape() Shape {
	return &Circle{}
}

// Конкретный Создатель
type SquareFactory struct{}

func (sf *SquareFactory) CreateShape() Shape {
	return &Square{}
}

// Использование
func main() {
	circleFactory := &CircleFactory{}
	circle := circleFactory.CreateShape()
	fmt.Println(circle.Draw()) // Output: Drawing a Circle

	squareFactory := &SquareFactory{}
	square := squareFactory.CreateShape()
	fmt.Println(square.Draw()) // Output: Drawing a Square
}