Назад к вопросам
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
}