PHP - Как обмениваться настройками между несколькими дочерними классами и создавать экземпляры этих общих настроек один раз? - PullRequest
2 голосов
/ 19 февраля 2012

Допустим, у меня есть 3 класса PHP: ShedBuilder, HouseBuilder и TableBuilder и следующий код:

$worker_1 = new ShedBuilder(); // I only know how to build a shed
$worker_2 = new HouseBuilder(); // I only know how to build a house
$worker_3 = new TableBuilder(); // I only know how to build a table

$worker_1->build();
$worker_2->build();
$worker_3->build();

Я хочу, чтобы классы worker_1, worker_2 и worker_3 каждый совместно использовали один и тот же набор инструментов для задания, например, я хочу, чтобы все 3 работника использовали доступные инструменты, в данном случае молоток, отвертка, гвозди и т. Д. Но worker_1 построит сарай, работник_2 построит дом, работник_3 построит стол.

Каков наилучший способ настроить набор инструментов один раз, а затем дать каждому из трех рабочих знать, как получить доступ к инструментам, необходимым им для работы?

Я думал о том, чтобы Shed / Table / House builder каждый расширялся от родительского класса Builder, но это означает, что когда я создаю экземпляр каждого из них, мне нужно дать им каждый набор инструментов:

$toolset = new Toolset();
$toolset->addTool('hammer');
$toolset->addTool('screwdriver');
$toolset->addTool('nails');

$worker_1 = new ShedBuilder($toolset);
$worker_2 = new HouseBuilder($toolset);
$worker_3 = new TableBuilder($toolset);

Я бы предпочел создать экземпляр инструментов один раз, а затем дать знать всем трем рабочим / классам о наборе инструментов и построить каждый из их элементов соответственно.

Какой лучший способ реализовать то, что я пытаюсь сделать в PHP?

Ответы [ 2 ]

4 голосов
/ 19 февраля 2012

То, что у вас уже есть, создание экземпляра Toolset и предоставление $toolset каждому рабочему классу в их конструкторах, называется Внедрение зависимости , , и на самом деле этопредпочтительный способ решения этой задачи большую часть времени.

Этого можно достичь, создав одиночный объект Toolset, однако в этом нет необходимости, когда внедрение зависимостей обрабатывает его аккуратно и легко тестируемым образом.

0 голосов
/ 19 февраля 2012

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

...