Статические методы Factory Method


Я создаю класс с помощью Factory Method и мне пришла в голову следующие вопросы.

рекомендуется использовать статические методы Factories?

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

<?php
/* Factory and car interfaces */
interface CarFactory {
    public function makeCar();
}

interface Car {
    public function getType();
}

/* Implementações da Factory e Car */
class SedanFactory implements CarFactory {
    public function makeCar() {
        return new Sedan();
    }
}

class Sedan implements Car {
    public function getType() {
        return 'Sedan';
    }
}

/* Client */
$factory = new SedanFactory();
$car = $factory->makeCar();
print $car->getType(); 

Источник

Обратите внимание на разницу в реализации, методы статические:

<?php
/* Factory and car interfaces */
interface CarFactory {
    public static function makeCar();
}

interface Car {
    public function getType();
}

/* Implementações da Factory e Carro */
class SedanFactory implements CarFactory {
    public static function makeCar() {
        return new Sedan();
    }
}

class Sedan implements Car {
    public function getType() {
        return 'Sedan';
    }
}

/* Client */
$car = SedanFactory::makeCar();
print $car->getType(); 
Author: gmsantos, 2014-07-08

2 answers

Обратите внимание, что есть 2 design patterns, связанные с Factory Method:

  1. Factory Method - http://sourcemaking.com/design_patterns/factory_method
  2. Static Factory Method - http://www.informit.com/articles/article.aspx?p=1216151

Таким образом, ответ на ваш вопрос, зависит от дизайна pattern желаемого.

Factory Pattern реализуется как уже говорилось до сих пор, без статических методов. Однако, Static Factory Method, немного отличается (например, в Java, но я считаю, что идея та же):

public class Boolean {
  ...
  public static Boolean valueOf(boolean b) {
     return b ? Boolean.TRUE : Boolean.FALSE;
  }
  ...
}

Статический фабричный Метод является более простым и уже возвращает тип prórpria класса, как в примере Boolean.

Уже фабричный Метод, не определяется с помощью статических методов. В том числе, их реализация в википедии (http://pt.wikipedia.org/wiki/Factory_Method) не использует статические методы.

Я Считаю, что здесь есть подвох во всем этом. Шаблоны проектирования являются направляющие хорошие практики, но могут быть адаптированы для наших нужд. В случае если экземпляр объекта каждый час, который называется метод factory является дорогостоящим, не вижу никаких проблем в использовании статических методов. Однако, это изменение design pattern.

 5
Author: EduardoFernandes, 2014-07-13 02:01:09

, будучи Не в статической, вы получаете в "настройки" и в "обмене", от своего завода.

, конфигурации, я хочу сказать, что вы можете изменить значение или вызова метода любого класса SedanFactory перед вызовом makeCar(), изменив, как автомобиль будет построен (как Ренан говорил).

С обменом фабрики, хочу сказать, что вы можете иметь метод, который получает в качестве параметра объект класса любой, который реализует CarFactory, зная, что может вызвать makeCar() для создания автомобиля без необходимости знать, является ли SedanFactory и SUVFactory.

 3
Author: Pedro Lorentz, 2014-07-11 23:47:30