← Назад к вопросам

Что такое паттерн проектирования Factory?

1.8 Middle🔥 151 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Паттерн Factory

Factory (Фабрика) — это порождающий паттерн проектирования, который предоставляет интерфейс для создания объектов, но не определяет их конкретные классы. Это позволяет отложить создание объектов на более позднее время и делает систему независимой от того, как создаются её объекты.

Проблема без Factory

Иногда нужно создавать объекты разных типов на основе данных. Без паттерна код будет содержать множество условных операторов (if-else), привязанных к конкретным классам:

// Плохо: жёсткая привязка к классам
if (type.equals("PDF")) {
    document = new PDFDocument();
} else if (type.equals("WORD")) {
    document = new WordDocument();
} else if (type.equals("EXCEL")) {
    document = new ExcelDocument();
}

Решение: Simple Factory

public interface Document {
    void open();
    void close();
}

public class PDFDocument implements Document {
    @Override
    public void open() {
        System.out.println("Opening PDF...");
    }
    
    @Override
    public void close() {
        System.out.println("Closing PDF...");
    }
}

public class WordDocument implements Document {
    @Override
    public void open() {
        System.out.println("Opening Word...");
    }
    
    @Override
    public void close() {
        System.out.println("Closing Word...");
    }
}

// Фабрика
public class DocumentFactory {
    public static Document createDocument(String type) {
        switch (type.toLowerCase()) {
            case "pdf":
                return new PDFDocument();
            case "word":
                return new WordDocument();
            case "excel":
                return new ExcelDocument();
            default:
                throw new IllegalArgumentException("Unknown document type: " + type);
        }
    }
}

// Использование
Document doc = DocumentFactory.createDocument("pdf");
doc.open();

Abstract Factory

Для создания семейств объектов используют Abstract Factory:

public interface Button {
    void click();
}

public interface Checkbox {
    void toggle();
}

public interface UIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

// Конкретная реализация для Windows
public class WindowsButton implements Button {
    @Override
    public void click() {
        System.out.println("Windows button clicked");
    }
}

public class WindowsUIFactory implements UIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }
    
    @Override
    public Checkbox createCheckbox() {
        return new WindowsCheckbox();
    }
}

// Использование
UIFactory factory = new WindowsUIFactory();  // или MacUIFactory
Button btn = factory.createButton();
Checkbox chk = factory.createCheckbox();

Плюсы и минусы

Плюсы:

  • Избегаем жёсткой привязки к конкретным классам
  • Централизованное создание объектов
  • Легко добавлять новые типы
  • Упрощает тестирование (можно подменять фабрики)

Минусы:

  • Может привести к излишней сложности для простых случаев
  • Больше классов в коде

Когда использовать

  • Система не должна зависеть от того, как создаются её продукты
  • Нужна гибкость в выборе типов объектов
  • Много условных операторов для создания объектов
  • Нужна возможность подменять реализации (для тестов)

Factory — один из самых важных паттернов в Java, особенно в Spring Framework и других enterprise-фреймворках.

Что такое паттерн проектирования Factory? | PrepBro