Я хочу улучшить свои знания о PHP Pattern и архитектуре.
Я создаю глупый пример использования Factory Pattern
Это мой код:
index.php
$shape = Shape::getShape('circle', 3);
echo $shape->getArea();
shapes.php
class Shape
{
public static function getShape($type, $num)
{
switch ($type) {
case 'circle':
return new Circle($num);
break;
case 'square':
return new Square($num);
break;
default:
throw new Exception("Unrecognized shape");
}
}
}abstract class Form{
abstract public function getArea();
}
class Circle extends Form{
protected $_type = "Circle";
private $area;
/**
* circle constructor.
* @param $area
*/
public function __construct($area)
{
$this->area = $area;
}
public function getArea(){
return $this->area*pi();
}
}
Где преимущества такого подхода?
Я мог бы сделать это, чтобы создать объект круга
$circle = new Circle(3);
echo $circle->getArea();
Единственное преимущество, которое я вижу при использовании Factory Pattern, заключается в том, что я не могу знать, какую Shape хочет пользователь.
С таким упрощенным примером, как ваш, нет никаких реальных преимуществ; но реальная фабрика обычно применяет бизнес-логику, чтобы определить, какой класс создавать, а не указывать, какой класс вы хотите вернуть.
В вашем примере вы конкретно говорите, какую фигуру вы хотите, и тогда она просто возвращает объект соответствующего типа; но предположим, что вы знали только, сколько у вас было углов, и передали это количество углов фабрике, тогда он мог бы определить, какой объект формы нужно вернуть … вы изменили логику, зная, что 3 угла означает треугольник, 4 углы означает квадрат и т. д. для фабрики.
Это все еще слишком упрощенный пример, но, возможно, демонстрирует хотя бы одно преимущество фабричной модели.
Фабрика может также обрабатывать внедрение зависимостей в ваши объекты: фабрика должна знать зависимости, в то время как вызывающий код не имеет доступа к зависимостям, или даже знать, какими они могут быть, и поэтому не сможет создать экземпляр требуемого класса в свой.
Других решений пока нет …