Когда инженеры-программисты говорят о шаблонах проектирования, они обычно говорят об установленных и повторно используемых конструкциях или архитектурах, которые решают конкретные проблемы. По большей части шаблоны проектирования определяются независимо от языков программирования. Если вы новичок в программировании, вы, вероятно, все еще не понимаете, о чем я говорю. В любом случае, вы, вероятно, использовали шаблон дизайна в какой-то момент, даже не подозревая об этом. Далее я представляю пять шаблонов проектирования, о которых должен знать каждый инженер-программист.

Кто создает и кто использует шаблоны дизайна?

Что ж, может каждый. Если мы кратко рассмотрим историю шаблонов проектирования, мы обнаружим, что они восходят к Кристоферу Александру, архитектору, который написал статьи и книги, такие как «Узор улиц» или «Язык шаблонов», в которых он говорит о актуальные архитектурные решения, материалы и инструменты.

В основе […] лежит идея, что люди должны проектировать свои дома, улицы и сообщества. Эта идея […] исходит из наблюдения, что большинство прекрасных мест в мире были созданы не архитекторами, а людьми.

- Кристофер Александр и др., Язык шаблонов, передняя обложка книги

На мой взгляд, это очень подходящая метафора, потому что каждый может определить шаблон дизайна, даже если это обычно делают более опытные разработчики. Вы ожидаете, что опытный архитектор программного обеспечения создаст очень сложные шаблоны проектирования; однако каждый разработчик находится в уникальной ситуации и сталкивается с проблемами, требующими индивидуальных решений. Не каждую проблему нужно решать с помощью шаблона проектирования, но опытный инженер-программист признает хорошую возможность.

Если вы относительно новичок в программировании, вы, вероятно, не начнете определять шаблоны дизайна после создания нескольких «Hello Worlds». Более вероятно, что вы начнете приобретать опыт, изучая и «употребляя» определенные фреймворки, такие как Vue, Angular или ASP. И пока вы это сделаете, вы, вероятно, узнаете о шаблонах дизайна. Когда вы подниметесь по лестнице технологического мастерства, вы узнаете еще больше до тех пор, пока в какой-то момент не перестанете использовать только технологические фреймворки и шаблоны проектирования, но также начнете создавать свои собственные.

Но хватит вступления. Давайте перейдем к моему списку из пяти шаблонов проектирования, которые необходимо знать разработчикам программного обеспечения.

Синглтон

Синглтон - очень очевидный выбор и, вероятно, встречается в каждом списке шаблонов проектирования. И для этого есть веские причины: его относительно легко понять, он используется во многих проектах и ​​является неотъемлемой частью других шаблонов проектирования. Популярные примеры приложений для Singleton включают в себя драйверы баз данных и экземпляры регистраторов. Синглтон гарантирует, что существует только один экземпляр класса. В следующем фрагменте кода показано, как создать синглтон (C #):

Статический метод доступа Instance гарантирует, что будет создан новый экземпляр класса, если он еще не существует. В противном случае он возвращает уже созданный экземпляр. Поскольку он является общедоступным статическим средством доступа, к одному и тому же экземпляру можно получить доступ из любой точки сборки.

Но зачем вам нужен только один экземпляр?

Приведенный ранее пример драйвера базы данных на самом деле является устаревшим, потому что вам следует применять некий шаблон параллелизма, а не синглтон - синглтон в этом случае будет так называемым «анти-шаблоном». Как упоминалось ранее, синглтоны часто являются частью других шаблонов проектирования, таких как шаблон построителя, фабрики или прототипа, которые существуют для создания экземпляров объектов, потому что, например, им могут потребоваться глобальные конфигурации для инициализации, и эти конфигурации и свойства должны поддерживаться единичный экземпляр любой ценой. Еще одно преимущество синглтона - это ленивая инициализация - помните, что объект будет создан при первом доступе.

Фасад

Паттерн Фасад указывает на связь с реальной архитектурой, имитируя видимый фасад здания. Вы видите только то, что видно спереди, но не видите, что находится внутри - комнаты, интерьер, электричество и так далее. С технической точки зрения: фасад - это открытый интерфейс для сложной системы, скрытой от пользователя. Если хотите, это упрощает сложную систему. Фасады обычно используются в объектно-ориентированных языках программирования.

Для построения примера с архитектурой: представьте, что у вас есть система, состоящая из двух компонентов - жилищного и жилого компонентов. Эти компоненты необходимы вам для организации вечеринки, которая может выглядеть следующим образом.

Фасад для планирования вечеринки будет использовать компоненты соответствующим образом и упростит сложную и сложную систему.

Фасад требует, чтобы вы только начали вечеринку или остановили ее. Вам не нужно беспокоиться о уборке, приготовлении пищи или покупках. С другой стороны, IPartyFacade не позволяет добавлять в список другие напитки. Вы жертвуете гибкостью ради удобства.

Адаптер

Шаблон адаптера используется, когда у вас есть компонент, который вы хотите интегрировать в среду, которая изначально не предназначалась для использования таким образом. Чтобы проиллюстрировать этот пример, предположим, что у нас есть система, которая отвечает за зарядку мобильных телефонов. До сих пор это работало только с iPhone. Теперь вы добавляете телефоны Android, которые также нуждаются в зарядке, но вы не можете использовать зарядное устройство для iPhone из-за проблем несовместимости. Ваш адаптер будет PhoneAdapter, реализующим как iPhone, так и Android Phone, который сможет различать оба телефона и предоставить вам правильный метод зарядки.

Декоратор

Этот шаблон проектирования динамически расширяет базовый класс функциями, которые отсутствуют в базовом классе, не затрагивая реализации базовых классов. Это может показаться довольно абстрактным, поэтому для пояснения взгляните на следующий пример:

Класс abstract HouseAccessories украшает IHouse и предоставляет дополнительные функции. В методе SellHouse мы используем базовый AtticHouse и расширяем его, добавляя MultiStoryPackage, а также CustomPaintingPackage. Результирующий результат будет

Дом: Дом с мансардой + многоэтажный пакет + индивидуальная покраска Стоимость пакета: 36000

Внедрение зависимости

Последний шаблон дизайна в моем списке - внедрение зависимостей. Этот вариант проще, чем кажется на первый взгляд, но, по моему опыту, он имеет тенденцию сбивать с толку начинающих программистов. Идея состоит в том, чтобы разделить проблемы, поддразнивая создание объекта отдельно от его использования. Это может повысить удобочитаемость и возможность повторного использования кода, но, с другой стороны, усиливает определенный уровень сложности решения: разработчикам приходится перемещаться по большему количеству классов, в IDE могут возникать проблемы с разрешением ссылок и дополнительные предварительные усилия по реализации для настройки зависимости не требуется.

Как видите, зависимость определяется интерфейсом, а не реализующим классом. Это может быть какой-то класс регистратора, но на самом деле ему не нужно знать. Единственное, что должен знать использующий класс, - это то, что у зависимости есть функция с именем Write, чтобы иметь возможность ее использовать. Однако инфраструктура внедрения зависимостей должна знать, какую реализацию использовать. В следующем кратком примере ASP.NET Core показано, как удовлетворить это требование:

Для получения дополнительной информации о внедрении зависимостей см. Внедрение зависимостей ASP.NET Core или более общую информацию можно найти здесь.

дальнейшее чтение

Как было сказано в начале статьи, существует множество шаблонов проектирования, и многие из них, такие как шаблоны стратегий и памятных вещей, заслуживают внимания. Если вам интересно копнуть глубже, рекомендую книгу Паттерны проектирования. Элементы объектно-ориентированного программного обеспечения многократного использования » Эрих Гамма и др.