Фабричный метод: одна из реализаций. Как?

denisOg

Новичок
Фабричный метод порождает объекты.
Постараюсь не писать много кода, думаю многие меня поймут на словах)
Реализации фабричного метода:
  1. Есть фабричный класс со статическим фабричным методом. При вызове метода, передаю какой то параметр. Внутри метода происходит условный поиск и мне возвращают
    PHP:
     return new SomeClass();
    . Использование:
    Код:
    .............
    $type = 'post';
    ........
    $post = FactoryClass::create($type);
    .......................
  2. Эту реализацию часто встретил в интернете. Она реализована с интерфейсам. Для каждого возвращаемого класса создается свой фабричный класс, который возвращает только объект одного класса. Все эти фабричные классы имеют один интерфейс. А также все классы, которые возвращаются, также имеют общий интерфейс. Реализация (из википедии :)):
    Код:
    <?php
    interface Product{
        public function GetName();
    }
    class ConcreteProductA implements Product{
        public function GetName() { return "ProductA"; }
    }
    class ConcreteProductB implements Product{
        public function GetName() { return "ProductB"; }
    }
    interface Creator{
        public function FactoryMethod();
    }
    class ConcreteCreatorA implements Creator{
        public function FactoryMethod() { return new ConcreteProductA(); }
    }
    class ConcreteCreatorB implements Creator{
        public function FactoryMethod() { return new ConcreteProductB(); }
    }
    ?>
Так вот. Мне в моем классе все равно нужен условный оператор, что бы определить, какой Creator мне вызвать, что бы тот вернул класс.
Использование:
Код:
.............
$type = 'productA';
........
if($type == 'productA') {
$creator = new ConcreteCreatorA();
}
if($type == 'productB') {
$creator = new ConcreteCreatorB();
}
$post = $creator->FactoryMethod();
.......................
Получается я не избавился от условного оператора? Или я что то не так понял?)
 

WMix

герр M:)ller
Партнер клуба
все это слишком абстрактно, я могу подсказать более простой способ специально для данного примера
PHP:
$type = 'productA';
$creatorClass = 'ConcreteCreator'.substr($type, -1);
if(class_exists($creatorClass) && in_array('Creator', class_implements($creatorClass )){
  $creator = new $creatorClass;
  $post = $creator->FactoryMethod();
}
else throw new Exception(...);
лучше понять зачем тебе нужен $creator и пока этого не осознаешь, можно писать еще проще
PHP:
$type= 'productA';
$productClass = 'Concrete'.ucfirst($type);
if(class_exists($productClass ) && in_array('Product', class_implements($productClass ))
  $post = new $productClass;
else throw new Exception(...);

зы писал не тестируя.
 
Сверху