2016-05-13 2 views
0

Я хочу улучшить свои знания о шаблоне и архитектуре PHP. создать глупый пример, чтобы использовать фабричную модельШаблон Factory PHP, какие преимущества у меня есть?

Это мой код:

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(); 
    } 
} 

Где находится advanteges, чтобы использовать этот подход ?

Я мог бы это сделать, чтобы создать Circle объект

$circle = new Circle(3); 
echo $circle->getArea(); 

Единственное преимущество, что я могу видеть использование Factory Pattern является то, что я мог не знать, какие формы пользователь хотят.

ответ

0

С упрощенным примером, таким как ваш, нет никаких реальных преимуществ; но реальная фабрика, как правило, применяет бизнес-логику, чтобы определить, какой класс следует создавать, а не рассказывать, какой класс вы хотите вернуть.

В вашем примере вы конкретно говорите, какую форму хотите, а затем она просто возвращает объект соответствующего типа; но предположим, что вы только знали, сколько углов у вас было, и передали это количество углов на завод, тогда он мог определить, какой объект формы вернуться ... вы переместили логику, зная, что три угла означают треугольник, 4 углы означают квадрат и т. д. на заводе.

Это все еще чрезмерно упрощенный пример, но, возможно, демонстрирует преимущество одного из заводских шаблонов.

Фабрика также может обрабатывать инъекции зависимостей для ваших объектов: фабрика должна знать зависимости, в то время как вызывающий код не имеет доступа к зависимостям или даже знает, какими они могут быть, и поэтому не сможет создавать экземпляры необходимый класс сам по себе.

+0

Спасибо знак. В вашем примере (3 или 4 угла) я могу выполнить вызов кода вызова вместо заводского кода. Почему этот подход не подходит ?. И я мог бы использовать Injection Dependency в Triangle Class, например. Конечно, я могу получить один и тот же результат несколькими способами. – monkeyUser

+0

Вы всегда можете избежать использования фабричного класса, поместив логику в свой главный код вызова .... но если вам нужно создавать фигуры в разных точках вашего кода, вы либо повторяете эту логику, либо называете класс/метод который обрабатывает его, чтобы избежать повторения; лучше в своем классе для обеспечения SRP SOLID (принцип единой ответственности), и сразу у вас есть завод –

+0

спасибо, что это понятно – monkeyUser

Смежные вопросы