<?php /* * DesignPatternPHP */ namespace DesignPatterns\FactoryMethod; /** * FactoryMethod is a factory method. The good point over the SimpleFactory * is you can subclass it to implement different way to create vehicle for * each country (see subclasses) * * For simple case, this abstract class could be just an interface * * This pattern is a "real" Design Pattern because it achieves the * "Dependency Inversion Principle" a.k.a the "D" in S.O.L.I.D principles. * * It means the FactoryMethod class depends on abstractions not concrete classes. * This is the real trick compared to SImpleFactory or StaticFactory. */ abstract class FactoryMethod { const CHEAP = 1; const FAST = 2; /** * The children of the class must implement this method * * Sometimes this method can be public to get "raw" object * * @param string $type a generic type * * @return Vehicle a new vehicle */ abstract protected function createVehicle($type); /** * Creates a new vehicle * * @param int $type * * @return Vehicle a new vehicle */ public function create($type) { $obj = $this->createVehicle($type); $obj->setColor("#f00"); return $obj; } }