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

Как использование шаблонов применяется в ООП

2.0 Middle🔥 241 комментариев
#SOLID и паттерны проектирования

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

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

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

# Шаблоны в ООП

Шаблоны проектирования (design patterns) — это проверенные решения типичных проблем в разработке. Они описывают отношения между классами и объектами и помогают написать масштабируемый, поддерживаемый код.

Три основные группы шаблонов

1. Порождающие (Creational)

Отвечают за создание объектов. Примеры:

  • Singleton — гарантирует единственный экземпляр класса
  • Factory — создание объектов без указания конкретных классов
  • Builder — пошаговое создание сложных объектов
// Builder пример
public class User {
    private String name;
    private String email;
    private int age;
    
    public static class Builder {
        private String name;
        private String email;
        private int age;
        
        public Builder name(String name) {
            this.name = name;
            return this;
        }
        
        public Builder email(String email) {
            this.email = email;
            return this;
        }
        
        public User build() {
            User user = new User();
            user.name = this.name;
            user.email = this.email;
            user.age = this.age;
            return user;
        }
    }
}

// Использование
User user = new User.Builder()
    .name(\"John\")
    .email(\"john@example.com\")
    .build();

2. Структурные (Structural)

Определяют отношения между сущностями. Примеры:

  • Adapter — совместимость несовместимых интерфейсов
  • Decorator — добавление функциональности к объектам динамически
  • Facade — упрощение сложного подсистемы
// Decorator пример
public interface Component {
    void display();
}

public class SimpleComponent implements Component {
    @Override
    public void display() {
        System.out.println(\"Simple component\");
    }
}

public abstract class Decorator implements Component {
    protected Component component;
    
    public Decorator(Component component) {
        this.component = component;
    }
}

public class BorderDecorator extends Decorator {
    public BorderDecorator(Component component) {
        super(component);
    }
    
    @Override
    public void display() {
        System.out.println(\"*** Border ***\");
        component.display();
        System.out.println(\"*** Border ***\");
    }
}

3. Поведенческие (Behavioral)

Определяют взаимодействие объектов. Примеры:

  • Observer — оповещение множества объектов об изменениях
  • Strategy — выбор алгоритма во время выполнения
  • State — изменение поведения при изменении состояния
// Observer пример
public interface Observer {
    void update(String event);
}

public class Subject {
    private List<Observer> observers = new ArrayList<>();
    
    public void attach(Observer observer) {
        observers.add(observer);
    }
    
    public void detach(Observer observer) {
        observers.remove(observer);
    }
    
    public void notifyObservers(String event) {
        for (Observer observer : observers) {
            observer.update(event);
        }
    }
}

Применение в ООП

Преимущества:

  • Ускоренная разработка (использование проверенных решений)
  • Улучшенная читаемость и поддержка кода
  • Снижение связанности между компонентами
  • Облегчение расширения функциональности

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

  1. Когда встречаешься с типичной проблемой
  2. Когда нужна гибкость в расширении
  3. Когда требуется слабая связанность
  4. Когда нужна переиспользуемость кода

Основные принципы:

  • DRY (Don't Repeat Yourself)
  • SOLID (Single, Open/Closed, Liskov, Interface Segregation, Dependency Inversion)
  • Композиция вместо наследования