HTML Diff
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-&gt;makeInterviewer(); $interviewer-&gt;askQuestions(); } }<p>А теперь любой дочерний класс способен его расширять, предоставляя необходимого интервьюера:</p>
7 abstract class HiringManager { // Фабричный метод abstract public function makeInterviewer(): Interviewer; public function takeInterview() { $interviewer = $this-&gt;makeInterviewer(); $interviewer-&gt;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-&gt;takeInterview(); // Вывод: Спрашивает о шаблонах проектирования! $marketingManager = new MarketingManager(); $marketingManager-&gt;takeInterview(); // Вывод: Спрашивает про работу с сообществом<h2>Когда полезен фабричный метод?</h2>
9 $devManager = new DevelopmentManager(); $devManager-&gt;takeInterview(); // Вывод: Спрашивает о шаблонах проектирования! $marketingManager = new MarketingManager(); $marketingManager-&gt;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