Страницы

Поиск по вопросам

среда, 12 июня 2019 г.

Правильно ли я понял абстрактную фабрику?

Пожалуйста, подскажите, являются мои ли каляки реализацией паттерна "абстрактная фабрика"? Правильно ли я его понял? Спасибо
/* * Цветы */ interface IFlower{ function getColor(); function smell(); }
abstract class AFlower implements IFlower{ abstract function getColor(); abstract function smell(); }
class Rose extends AFlower{ function getColor(){ return "red"; }
function smell(){ return "smell of roses"; } }
class Violet extends AFlower{ function getColor(){ return "blue"; }
function smell(){ return "smell of violets"; } }
/* * Фабрики */ interface IFactory{ function getFlower(); }
abstract class AbstractFactory implements IFactory{ abstract function getFlower(); }
class RosesFactory extends AbstractFactory { function getFlower(){ return new Rose(); } }
class VioletsFactory extends AbstractFactory { function getFlower(){ return new Violet(); } }
function getMeFlower(IFactory $factory){ if (!isset($factory)){ return false; } return $factory->getFlower(); }
$i = random_int(1, 2);
switch ($i){ case 1: $factory = new RosesFactory(); break; case 2: $factory = new VioletsFactory(); break; default: throw new Exception("This can not be!"); }
$flower = getMeFlower($factory); echo $flower->getColor();


Ответ

Объясню на вашем примере.
Сами по себе RosesFactory и VioletsFactory в таком виде не показывают преимуществ абстрактной фабрики.
Приведу цитату из Википедии
Абстрактная фабрика (англ. Abstract factory) — порождающий шаблон проектирования, предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.
То есть вам нужны интерфейсы:
IFlower и IFlowerPaper - взаимосвязанные объекты необходимые для букета
interface IBouqet { public function getFlower(); public function getPaper(); }
Букет может быть с бумагой или без, с разными цветами. (Возьмем за правило что разных цветов в букете не будет).
Покупатель захочет получить букет с определенной бумагой определяемой узором и цветом (по-этому это объект реализующий IFlowerPaper) и с определенными цветами (IFlower)
Наша абстрактная фабрика IBouqet служит для описания интерфейса букета для клиента.
В нашем магазине цветов есть конечное количество вариаций букетов. Классы-наследники IBouqet будут конкретными фабриками.
Например RosesBouqetFactory или VioletsBouqetFactory будут создавать конкретные букеты из конкретных составляющих. Розы могут быть разных сортов IRoses и фиалки IViolets, так-же им нужна бумага iFlowerPaper.
Покупатель выбирает розы красные, в такой-то упаковке или без неё.
— "Дайте мне красных роз в прозрачной упаковке тысяч за 5"

Или он выбирает просто цветы на выбор продавца (Абстрактной фабрики. Если эта абстрактная фабрика может создавать своего конкретного потомка например основываясь, например, на диапазоне цен и/или цвете).
— "Дайте мне симпатичный букетик тысяч за 5"

Комментариев нет:

Отправить комментарий