Пожалуйста, подскажите, являются мои ли каляки реализацией паттерна "абстрактная фабрика"? Правильно ли я его понял? Спасибо
/*
* Цветы
*/
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"
Комментариев нет:
Отправить комментарий