Шаблоны проектирования простым языком. Часть первая. Порождающие шаблоны. Что такое паттерн в программировании?

Это кажется сложным, но нужно время, чтобы привыкнуть к этому. Опытные разработчики уже «работают руками», поэтому у них гораздо меньше шансов столкнуться с проблемами при выборе шаблона. Как только вы поймете и примените это на практике, вам станет легче.

Паттерны в разработке — что это?

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

Паттерны — это способ структурирования программного кода особым образом. На практике они используются программистами для решения проблемы, чтобы снять «боль» с программиста. Предполагается, что существует список общих проблем с шаблонами (а он существует) и что эти проблемы встречаются относительно часто. И здесь на помощь приходят паттерны, которые являются лишь одним из способов решения этих проблем.

Немного истории

Сам вопрос о шаблонах не нов. Идея разработки принципов, которые описывают, как решать общие проблемы программирования/проектирования программного обеспечения, возникла в 1994 году, когда была опубликована знаменитая книга Design Patterns: Elements of Reusable Object-Oriented Software. Проект был начат группой авторов, которых иногда называют «Банда четырех» (сокращенно GoF). На самом деле это опытные инженеры-разработчики, и вот их имена:

  • Ральф Джонсон,
  • Ричард Хелм,
  • Эрих Гамма,
  • Джон Влиссидес.

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

Какова польза?

Но действительно ли использование шаблонов приносит пользу? Если использовать их с умом, то безусловно. Когда вы пишете программный код, вы можете формализовать проблему в терминах объектов, классов и соответствующих отношений между ними. Как только проблема формализована, для ее решения достаточно использовать один из существующих паттернов. Это экономит время разработчика, поскольку ему не приходится изобретать колесо. Уже есть готовый шаблон (метод решения) — нужно только правильно применить его к конкретной программе.

  Бурак – что означает? Определение, значение, примеры употребления. Бурак что это такое?

Важный момент: использование конкретного шаблона практически не зависит от языка программирования, системы или интерфейса. То есть, принципы использования паттернов проектирования в Java, C-Sharp и других языках схожи.

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

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

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

Простая фабрика (Simple Factory)

В объектно-ориентированном программировании (ООП) фабрика — это объект для создания других объектов. Фабрика — это обычно функция или метод, который возвращает объекты изменяемого прототипа или класса из вызова метода, который считается «новым».

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

Проще говоря, простой завод производит шкаф для клиента, без какой-либо видимой логики.

Теперь перейдем к коду. У нас есть интерфейс Door и его реализация:

Интерфейс двериКласс WoodenDoor реализует класс Doorwidth = $width; $this->height = $height;>public function getWidth(): floatwidth;>public function getHeight(): floatheight;>>

Затем есть DoorFactory, которая создает дверь и возвращает ее:

Класс DoorFactory>

И тогда мы сможем использовать их все:

$door = DoorFactory::makeDoor(100, 200); echo 'Width: '. $door->getWidth(); echo 'Height: '. $door->getHeight(),

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

Фабричный метод (Fabric Method)

Метод фабрики — это шаблон проектирования, который предоставляет подклассам интерфейс для создания экземпляров класса. Во время создания наследники могут указать, какой класс создавать. Другими словами, этот шаблон делегирует создание объектов потомкам родительского класса. Это позволяет использовать в программном коде абстрактные объекты более высокого уровня вместо конкретных классов.

Тематическое исследование: Возьмем пример менеджера по персоналу. Невозможно, чтобы один человек проводил собеседование со всеми кандидатами на все рабочие места. В зависимости от работы, он должен распределить этапы собеседования между разными людьми.

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

Go-разработчик в команду Avito Goods (Fashion) Avito, Москва, возможно удаленно, по результатам собеседования.

Теперь перейдем к коду. Возьмем вышеприведенный пример с менеджером по персоналу. Во-первых, у нас есть интерфейс интервьюера и его различные реализации:

Интерфейс интервьюераКласс Разработчик реализует Интервьюера>Класс CommunityExecutive реализует интервьюера>

Теперь давайте создадим нашего менеджера по найму:

абстрактный класс HiringManagermakeInterviewer(); $interviewer->askQuestions();>>

И теперь любой дочерний класс может расширить его и реализовать необходимый интервьюер.

Абстрактная фабрика, генеративный шаблон проектирования, предоставляет интерфейс для создания семейств связанных или взаимозависимых объектов без необходимости указания их отдельных классов. Шаблон реализуется путем создания абстрактного фабричного класса, который предоставляет интерфейс для создания элементов системы (например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся классы, реализующие этот интерфейс.>Типичный пример: Давайте расширим наш пример с дверью и включим в него простую фабрику. В зависимости от ваших потребностей, вам может понадобиться деревянная дверь из одного магазина, железная дверь из другого или пластиковая дверь из третьего. Вам также понадобится соответствующий специалист: плотник для деревянной двери, сварщик для железной двери и т.д. Как видите, здесь есть связь между дверями.>
$devManager = new DevelopmentManager(); $devManager->takeInterview(); // Вывод: Спрашивает о шаблонах проектирования! $marketingManager = new MarketingManager(); $marketingManager->Проще говоря: фабрика. Фабрика, которая объединяет отдельные, но связанные/зависимые фабрики без определения их конкретных классов.

Теперь перейдем к коду. Рассмотрим пример с дверью. Сначала у нас есть интерфейс двери и его различные реализации:

Интерфейс двери

Абстрактная фабрика (Abstract Factory)

class WoodenDoor implements Door

class IronDoor implements Door

Затем у нас есть несколько экспертов по установке дверей для каждого типа дверей:

Интерфейс DoorFittingExpert

Интерфейс двериКласс WoodenDoor реализует класс Door>Теперь у нас есть DoorFactory, которую мы можем использовать для создания семейства связанных объектов. То есть, фабрика деревянных дверей даст нам деревянную дверь и специалиста по деревянным дверям. То же самое относится и к железным дверям:>

Интерфейс DoorFactory

// WoodenFactory возвращает деревянную дверь и плотника class WoodenDoorFactory implements DoorFactorypublic function makeFittingExpert(): DoorFittingExpert>// IronFactory возвращает железную дверь и сварщика class IronDoorFactory implements DoorFactory>

public function makeFittingExpert(): DoorFittingExpert

getDescription(); // Выход: работает только для железных дверейКак вы можете видеть, завод по производству деревянных дверей включает в себя столяра и деревянную дверь, а завод по производству железных дверей включает в себя железную дверь и сварщика. Таким образом, мы могли убедиться, что у нас есть нужный специалист для каждой двери.>>
$woodenFactory = new WoodenDoorFactory(); $door = $woodenFactory->makeDoor(); $expert = $woodenFactory->makeFittingExpert(); $door->getDescription(); // Вывод: Я деревянная дверь $expert->getDescription(); // Вывод: Я работаю только с деревянными дверями // Аналогично для железной двери $ironFactory = new IronDoorFactory(); $door = $ironFactory->makeDoor(); $expert = $ironFactory->makeFittingExpert(); $door->getDescription(); // Вывод: Я железная дверь $expert->

Оцените статью
Бизнес блог