Что такое паттерн Factory и как его применить?

«Что такое паттерн Factory и как его применить?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паттерн 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 (абстрактная фабрика) используется для создания семейств взаимосвязанных объектов.