SkillAgentSearch skills...

Russian

:ru: translation [WIP]

Install / Use

/learn @design-patterns-for-humans/Russian

README

Design Patterns For Humans

Шаблоны (паттерны) проектирования для людей


<p align="center"> 🎉 Ультра-простое объяснение шаблонов проектирования! 🎉 </p> <p align="center"> Тема, которая может легко смутить любого. Я, на максимально <i>простых</i> примерах, стараюсь объяснить их и оставить след в вашей (и, возможно, своей) голове. </p>

🚀 Вступление

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

Шаблоны проектирования - решения повторяющихся проблем; руководства как решить определенную проблему

Википедия опысывает их как:

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

⚠️ Будьте осторожны

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

Обратите также внимание, что примеры кода ниже будут на PHP-7 (Javascript - прим. переводчика), что не должно вас останавливать потому, что концепция все-равно одна и та же. Плюс, на подходе поддержка других языков

Типы Шаблонов Проектирования

Порождающие Шаблоны Проектирования

Простыми словами:

Порождающие шаблоны (англ. Creational patterns) сфокусированы на процессе инстанцирования объектов или групп связанных объектов

Википедия:

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

🏠 Простая фабрика (англ. simple factory)

Пример из реального мира

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

Простыми словами

Простая фабрика просто создает экземпляр для клиента не предоставляя клиенту какой либо логики создания.

Википедия

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

Пример кода

Прежде всего у нас есть интерфейс door и его имплементация

interface Door
{
    public function getWidth(): float;
    public function getHeight(): float;
}

class WoodenDoor implements Door
{
    protected $width;
    protected $height;

    public function __construct(float $width, float $height)
    {
        $this->width = $width;
        $this->height = $height;
    }

    public function getWidth(): float
    {
        return $this->width;
    }

    public function getHeight(): float
    {
        return $this->height;
    }
}

Затем фабрика DoorFactory создает двери и возвращает их.

class DoorFactory
{
    public static function makeDoor($width, $height): Door
    {
        return new WoodenDoor($width, $height);
    }
}

И затем, мы это можем использовать так

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

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

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

🏭 Фабричный метод (англ. factory method)

Пример из реального мира

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

Простыми словами

Обеспечивает возможность передачи логики создания в дочерние классы.

Википедия

Фабричный метод (англ. Factory Method также известен как Виртуальный конструктор (англ. Virtual Constructor)) — порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать. Иными словами, Фабрика делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне.

Пример кода

Возьмем пример нашего менеджера по персоналу. Прежде всего создадим интерфейс Interviewer и несколько его реализаций.

interface Interviewer
{
    public function askQuestions();
}

class Developer implements Interviewer
{
    public function askQuestions()
    {
        echo 'Asking about design patterns!';
    }
}

class CommunityExecutive implements Interviewer
{
    public function askQuestions()
    {
        echo 'Asking about community building';
    }
}

Теперь давайте создадим HiringManager

abstract class HiringManager
{

    // Factory method
    abstract public function makeInterviewer(): Interviewer;

    public function takeInterview()
    {
        $interviewer = $this->makeInterviewer();
        $interviewer->askQuestions();
    }
}

Теперь любой потомок может наследовать его и предоставить требуемый Interviewer

class DevelopmentManager extends HiringManager
{
    public function makeInterviewer(): Interviewer
    {
        return new Developer();
    }
}

class MarketingManager extends HiringManager
{
    public function makeInterviewer(): Interviewer
    {
        return new CommunityExecutive();
    }
}

затем это может быть использованно следующим образом

$devManager = new DevelopmentManager();
$devManager->takeInterview(); // Output: Asking about design patterns

$marketingManager = new MarketingManager();
$marketingManager->takeInterview(); // Output: Asking about community building.

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

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

🔨 Абстрактная фабрика (англ. abstract factory)

Пример из реального мира

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

Простыми словами

Фабрика фабрик; фабика, которая группирует индивидуальные, но связанные/зависимые фабрики вместе без указания их конкретных классов.

Википедия

Абстрактная фабрика (англ. Abstract factory) — порождающий шаблон проектирования, предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (например, для оконного интерфейса он может создавать окна

View on GitHub
GitHub Stars59
CategoryDesign
Updated2mo ago
Forks9

Security Score

100/100

Audited on Jan 15, 2026

No findings