0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: fabric method, шаблон проектирования, фабричный метод, порождающие шаблоны</p>
1
<p>Теги: fabric method, шаблон проектирования, фабричный метод, порождающие шаблоны</p>
2
<p>Википедия нам говорит, что<strong>фабричный метод</strong>- это<strong>порождающий шаблон</strong>проектирования, который предоставляет подклассам интерфейс в целях создания экземпляров некоторого класса. При этом в момент создания наследники имеют возможность определить, какой именно класс создавать. Таким образом, этот шаблон проектирования делегирует создание объектов наследникам класса-родителя. В результате появляется возможность применять в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне.</p>
2
<p>Википедия нам говорит, что<strong>фабричный метод</strong>- это<strong>порождающий шаблон</strong>проектирования, который предоставляет подклассам интерфейс в целях создания экземпляров некоторого класса. При этом в момент создания наследники имеют возможность определить, какой именно класс создавать. Таким образом, этот шаблон проектирования делегирует создание объектов наследникам класса-родителя. В результате появляется возможность применять в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне.</p>
3
<p>Давайте абстрагируемся от программирования и попробуем перенести это на реальный жизненный пример. Представьте, допустим, ИТ-рекрутера. Какой бы он не был талантливый, он не сможет провести собеседования со всеми соискателями и по полному списку вакансий. Его задача заключается в другом: распределить этапы собеседования среди разных технических специалистов.</p>
3
<p>Давайте абстрагируемся от программирования и попробуем перенести это на реальный жизненный пример. Представьте, допустим, ИТ-рекрутера. Какой бы он не был талантливый, он не сможет провести собеседования со всеми соискателями и по полному списку вакансий. Его задача заключается в другом: распределить этапы собеседования среди разных технических специалистов.</p>
4
<p>Говоря простым языком, ИТ-рекрутер или HR-менеджер должен<strong>предоставить способ делегирования логики</strong>создания экземпляра дочерним классам.</p>
4
<p>Говоря простым языком, ИТ-рекрутер или HR-менеджер должен<strong>предоставить способ делегирования логики</strong>создания экземпляра дочерним классам.</p>
5
<p>Посмотрим, как это выглядит на примере PHP-кода. Поначалу у нас присутствует интерфейс Interviewer, а также несколько реализаций для этого интерфейса:</p>
5
<p>Посмотрим, как это выглядит на примере PHP-кода. Поначалу у нас присутствует интерфейс Interviewer, а также несколько реализаций для этого интерфейса:</p>
6
interface Interviewer { public function askQuestions(); } class Developer implements Interviewer { public function askQuestions() { echo 'Спрашивает о шаблонах проектирования!'; } } class CommunityExecutive implements Interviewer { public function askQuestions() { echo 'Спрашивает про работу с сообществом'; } }<p>Давайте сейчас создадим нашего HiringManager:</p>
6
interface Interviewer { public function askQuestions(); } class Developer implements Interviewer { public function askQuestions() { echo 'Спрашивает о шаблонах проектирования!'; } } class CommunityExecutive implements Interviewer { public function askQuestions() { echo 'Спрашивает про работу с сообществом'; } }<p>Давайте сейчас создадим нашего HiringManager:</p>
7
abstract class HiringManager { // Фабричный метод abstract public function makeInterviewer(): Interviewer; public function takeInterview() { $interviewer = $this->makeInterviewer(); $interviewer->askQuestions(); } }<p>А теперь любой дочерний класс способен его расширять, предоставляя необходимого интервьюера:</p>
7
abstract class HiringManager { // Фабричный метод abstract public function makeInterviewer(): Interviewer; public function takeInterview() { $interviewer = $this->makeInterviewer(); $interviewer->askQuestions(); } }<p>А теперь любой дочерний класс способен его расширять, предоставляя необходимого интервьюера:</p>
8
class DevelopmentManager extends HiringManager { public function makeInterviewer(): Interviewer { return new Developer(); } } class MarketingManager extends HiringManager { public function makeInterviewer(): Interviewer { return new CommunityExecutive(); } }<p>Вот, как это применяется:</p>
8
class DevelopmentManager extends HiringManager { public function makeInterviewer(): Interviewer { return new Developer(); } } class MarketingManager extends HiringManager { public function makeInterviewer(): Interviewer { return new CommunityExecutive(); } }<p>Вот, как это применяется:</p>
9
$devManager = new DevelopmentManager(); $devManager->takeInterview(); // Вывод: Спрашивает о шаблонах проектирования! $marketingManager = new MarketingManager(); $marketingManager->takeInterview(); // Вывод: Спрашивает про работу с сообществом<h2>Когда полезен фабричный метод?</h2>
9
$devManager = new DevelopmentManager(); $devManager->takeInterview(); // Вывод: Спрашивает о шаблонах проектирования! $marketingManager = new MarketingManager(); $marketingManager->takeInterview(); // Вывод: Спрашивает про работу с сообществом<h2>Когда полезен фабричный метод?</h2>
10
<p>Итак, Fabric Method пригодится, если существует какая-то общая обработка в классе, причём необходимый подкласс динамически определяется в процессе выполнения. Говоря иначе, клиент не знает, какой конкретно подкласс ему может понадобиться.</p>
10
<p>Итак, Fabric Method пригодится, если существует какая-то общая обработка в классе, причём необходимый подкласс динамически определяется в процессе выполнения. Говоря иначе, клиент не знает, какой конкретно подкласс ему может понадобиться.</p>
11
<p>Кстати, если интересует пример использования этого шаблона проектирования на языке Java, вам<a>сюда</a>.</p>
11
<p>Кстати, если интересует пример использования этого шаблона проектирования на языке Java, вам<a>сюда</a>.</p>
12
<p><em>По материалам статьи<a>"Design Patterns for Humans"</a>.</em></p>
12
<p><em>По материалам статьи<a>"Design Patterns for Humans"</a>.</em></p>
13
13