Комментарии (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-фреймворках.