Какие паттерны проектирования GoF вы использовали на практике?

«Какие паттерны проектирования GoF вы использовали на практике?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, использовал паттерны из каталога Gang of Four (GoF). Они помогают решать типовые задачи проектирования, делая код более гибким, переиспользуемым и поддерживаемым.

Наиболее часто применяемые паттерны:

  • Singleton (Одиночка): Для создания единственного экземпляра класса (например, подключения к базе данных, логгера).
  • Factory (Фабрика): Для инкапсуляции логики создания объектов, не привязывая клиентский код к конкретным классам.
  • Builder (Строитель): Для пошагового создания сложных объектов, отделяя конструирование от представления.
  • Observer (Наблюдатель): Для реализации механизма подписки и уведомлений об изменениях состояния.
  • Strategy (Стратегия): Для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости.

Пример Singleton на Java:

public class Database {
    private static volatile Database instance;

    private Database() {
        // Инициализация подключения
    }

    public static Database getInstance() {
        if (instance == null) {
            synchronized (Database.class) {
                if (instance == null) {
                    instance = new Database();
                }
            }
        }
        return instance;
    }
}

Пример Factory на Java:

public interface Shape {
    void draw();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

public class ShapeFactory {
    public Shape createShape(String type) {
        if (type.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        }
        // ... другие типы
        throw new IllegalArgumentException("Unknown shape type: " + type);
    }
}
// Использование
Shape shape = new ShapeFactory().createShape("CIRCLE");
shape.draw();