Ответ
Паттерн Factory (Фабрика) — это порождающий паттерн, который инкапсулирует логику создания объектов, предоставляя общий интерфейс. Клиентский код работает с абстракцией (интерфейсом/родительским классом), не зная конкретного класса создаваемого объекта.
Основная цель: Убрать прямое создание объектов через new или вызов конструктора из бизнес-логики, сделав систему более гибкой к добавлению новых типов объектов.
Пример на Python (Простая Фабрика):
from abc import ABC, abstractmethod
# Абстрактный продукт
class Document(ABC):
@abstractmethod
def open(self):
pass
@abstractmethod
def save(self):
pass
# Конкретные продукты
class PdfDocument(Document):
def open(self):
return "Opening PDF document with Acrobat Reader"
def save(self):
return "Saving document in PDF format"
class WordDocument(Document):
def open(self):
return "Opening DOCX document with Microsoft Word"
def save(self):
return "Saving document in DOCX format"
# Фабрика
class DocumentFactory:
"""Создает объекты документов на основе типа."""
@staticmethod
def create_document(doc_type: str) -> Document:
doc_type = doc_type.lower()
if doc_type == "pdf":
return PdfDocument()
elif doc_type == "docx" or doc_type == "word":
return WordDocument()
else:
raise ValueError(f"Unsupported document type: {doc_type}")
# Клиентский код
# Не зависит от конкретных классов PdfDocument или WordDocument
def process_document(doc_type: str):
try:
factory = DocumentFactory()
doc = factory.create_document(doc_type)
print(doc.open())
print(doc.save())
except ValueError as e:
print(f"Error: {e}")
# Использование
process_document("PDF") # Создаст и использует PdfDocument
process_document("docx") # Создаст и использует WordDocument
Когда использовать:
- Когда логика создания объекта сложная (зависит от конфигурации, внешних данных).
- Когда нужно создавать объекты из семейства связанных продуктов.
- Когда необходимо отделить код создания объектов от кода, который их использует.
Развитие паттерна: Abstract Factory (абстрактная фабрика) используется для создания семейств взаимосвязанных объектов.