Я не буду открывать америку, за правильными подходами прошу писать к Банде Четырёх, они в своё время уже разжевали эту тему вдоль и поперёк. Я же хочу исключительно закрепить свои знания и дать свои примеры, которые не будут сильно абстрактными. Постараюсь дать максимально живой кодовый пример, где мне это встречалось или могло встретиться.
В общем, если ты прочитал книжку по паттернам и тебе почему-то ничего не понятно, то скорее всего тебе не хватило конкретных примеров. Но иногда чтобы понять что-то не достаточно одного примера. У меня так было с Docker’ом, чтобы понять идею контейнеров мне потребовалось прочитать порядка 5-6 статей, которые объясняли бы концепцию с разных сторон. И только спустя месяц и несколько бессонных ночей пришло просветление.
Дисклеймер
Сразу хочу снять с себя всю ответственность за пояснения по тексту, я буду описывать отличия и особенности между паттернами в рамках своего понимания паттернов. Мне конечно пришлось проработать много литературы на этот счёт, но есть ненулевая вероятность, что моё понимание предмета и его истинное значение могут не совпадать. Поэтому не надо закидывать меня кАкушками, но за конструктивную критику в комментариях буду благодарен и готов вносить правки.
Изначально это должен бы быть пост про один тип паттернов, но в процессе описания примеров, понял, что объём получается непозволительно огромный, поэтому я решил по каждому паттерну сделать отдельный пост с примером, а отсюда пойдут ссылки. Дисклеймер буду таскать из поста в пост, чтобы повторяться.
Вообще, знание паттернов это не панацея хорошего кода. А в первое время скорее даже наоборот, если не хватает опыта, то появляется желание впихнуть куда-нибудь какой-нибудь из паттернов, чтобы быть крутым. Но на практике это так не работает. Во-первых, в чистом виде паттерны редко можно встретить, их применение всегда сопровождается некоторой адаптацией к предметной области. Иногда небольшой модификации, а иногда глубокой переработки. Но при объяснении архитектуры приложения другому разработчику проще сказать: «Я попытался применить абстрактную фабрику», и этого будет достаточно.
Из своей практики могу сказать, что в чистом виде многие паттерны достаточно многословны, поэтому лично я часто часть слоёв отбрасывал, чтобы не усложнять архитектуру. Но нужно признаться, что не так уж и часто я прибегаю к паттернам.
Вводная
При разговоре о паттернах нужно помнить одну главную вещь. Паттерны подразделяются на 3 типа:
- Порождающие
- Структурные
- Поведенческие
Именно с этого и стоит начинать разговор на всяких собеседованиях. По крайней мере я так делаю =) Это неплохой якорь в памяти. И уже дальше раскручивать каждый подраздел. С этого и начнем.
Порождающие
- Фабричный метод (Factory Method)
- Абстрактная фабрика (Abstract Factory)
- Строитель (Builder)
- Прототип (Prototype)
- Одиночка (Singletone)
Говорят, при разговоре о паттернах начинать с Singltone — плохая примета. Поскольку это сильно заезжанный пример, достаточно примитивный для понимания. К тому же в последнее время его всё больше и больше хотят обмазать какахами. Нужно признаться, есть за что, но об этом в соответствующей главе поговорим. Так что начни рассказ с фабрик, мой тебе совет.
Структурные
Этот тип паттернов имеет, на мой взгляд, самую сильную жизненную энергию «ци». Всё-таки архитектурная организация кода в больших системах, очень важный аспект.
- Адаптер (Adapter)
- Мост (Bridge)
- Компоновщик (Composite)
- Декоратор (Decorator)
- Фасад (Facade)
- Легковес (Flyweight)
- Заместитель (Proxy)
- Сущность-Атрибут-Значение (Entity-Attribute-Value EAV)
Последний, кстати, не был описан у Банды Четырёх, но знать его полезно, у меня было несколько проектов, где было удобно использовать именно его.
Поведенческие
- Цепочка обязанностей (Chain of responsibility)
- Команда (Command)
- Интерпретатор (Interpreter)
- Итератор (Iterator)
- Посредник (Mediator)
- Хранитель (Memento)
- Наблюдатель (Observer)
- Состояние (State)
- Стратегия (Strategy)
- Шаблонный метод (Template method)
- Посетитель (Visitor)
Ого! Кажется, я ввязался в схватку, которая может оказаться мне не по силам. А я думал, что порождающие паттерны самые многочисленные. В смысле, мне хотелось на это надеяться. Так что, если будешь следить за моими изысканиями, можешь запасаться гречкой, это будет не быстрая история.