Введение в паттерны проектирования
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 64 из 87.
Паттерны проектирования — это проверенные решения распространенных проблем, с которыми разработчики постоянно сталкиваются при создании программного обеспечения. Вместо того чтобы каждый раз изобретать велосипед, вы можете применять эти проверенные временем шаблоны для решения повторяющихся задач проектирования.
Думайте о паттернах проектирования как о чертежах. Они не предоставляют готовый код для копирования и вставки, но описывают, как структурировать ваши классы и объекты для решения определенного типа задач. Паттерны, которые вы изучите, используют концепции ООП, которые вы уже освоили: наследование, интерфейсы, полиморфизм и композицию.
Паттерны проектирования делятся на три основные категории:
| Категория | Назначение | Примеры |
|---|---|---|
| Порождающие | Как создаются объекты | Singleton, Factory, Builder |
| Структурные | Как компонуются объекты | Adapter, Decorator, Composite |
| Поведенческие | Как объекты взаимодействуют | Observer, Strategy, Command |
Зачем изучать паттерны проектирования? Они дают вам общий словарь с другими разработчиками — фраза «используй здесь Factory» мгновенно передает сложную идею. Они также помогают писать более гибкий и поддерживаемый код, применяя такие принципы, как «программируйте на уровне интерфейса, а не реализации».
В следующих уроках вы реализуете несколько основных паттернов, начиная с порождающих паттернов, таких как Singleton и Factory, а затем перейдете к поведенческим паттернам, таким как Observer и Strategy.
Задание
ЛегкоДавайте создадим простой классификатор паттернов, который продемонстрирует ваше понимание трех категорий паттернов проектирования! Вы создадите систему, которая классифицирует паттерны и объясняет их назначение, распределив код по нескольким файлам.
Вам нужно создать три файла:
Pattern.java: Создайте интерфейс с именемPattern, который определяет контракт для всех паттернов проектирования. Ваш интерфейс должен объявлять два метода:String getCategory(), который возвращает категорию паттерна (Creational, Structural или Behavioral), иString getPurpose(), который возвращает описание того, что делает эта категория паттернов.PatternInfo.java: Создайте три класса, реализующих ваш интерфейсPattern, каждый из которых представляет одну категорию паттернов проектирования:CreationalPattern— должен возвращать"Creational"для категории и"How objects are created"для цели.StructuralPattern— должен возвращать"Structural"для категории и"How objects are composed"для цели.BehavioralPattern— должен возвращать"Behavioral"для категории и"How objects communicate"для цели.Main.java: Соберите ваш классификатор паттернов воедино! Вы получите один входной параметр: имя паттерна (String), которое будет одним из следующих:"Singleton","Factory","Adapter","Decorator","Observer"или"Strategy".На основе входных данных создайте соответствующий объект паттерна:
"Singleton"и"Factory"— это Creational паттерны"Adapter"и"Decorator"— это Structural паттерны"Observer"и"Strategy"— это Behavioral паттерны
Сохраните объект паттерна в переменной типа
Pattern(интерфейс), демонстрируя принцип программирования на уровне интерфейса. Затем выведите следующие три строки:Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
Вы получите один входной параметр: название паттерна проектирования (String).
Эта задача закрепляет ключевую мысль урока: паттерны проектирования организованы в категории в зависимости от того, какую проблему они решают. Используя интерфейс, вы также практикуете принцип «программирования на уровне интерфейса, а не реализации» — основную концепцию, которая делает паттерны проектирования такими мощными!
Шпаргалка
Паттерны проектирования — это проверенные решения распространенных проблем в разработке программного обеспечения. Они представляют собой чертежи, описывающие, как структурировать классы и объекты для решения определенных типов задач.
Паттерны проектирования делятся на три основные категории:
| Категория | Цель | Примеры |
|---|---|---|
| Порождающие | Как создаются объекты | Singleton, Factory, Builder |
| Структурные | Как компонуются объекты | Adapter, Decorator, Composite |
| Поведенческие | Как объекты взаимодействуют | Observer, Strategy, Command |
Паттерны проектирования обеспечивают общий словарь для разработчиков и помогают писать более гибкий и поддерживаемый код, применяя такие принципы, как «программируйте на уровне интерфейса, а не реализации».
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String patternName = scanner.nextLine();
// TODO: Объявите переменную типа Pattern (интерфейс)
Pattern pattern = null;
// TODO: На основе patternName создайте соответствующий объект паттерна:
// - "Singleton" и "Factory" — это порождающие (Creational) паттерны
// - "Adapter" и "Decorator" — это структурные (Structural) паттерны
// - "Observer" и "Strategy" — это поведенческие (Behavioral) паттерны
// TODO: Выведите результат в следующем формате:
// Pattern: [введенное имя паттерна]
// Category: [категория из getCategory()]
// Purpose: [назначение из getPurpose()]
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»