2014-10-15 2 views
1

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

class CarFactory 
{ 
    public static function createCar($type) 
    { 
     if ($type == 'sport') { 
      return new SportCar(); 
     } elseif ($type == 'LuxuryCar' { 
      return new LuxuryCar(); 
     } 
    } 
} 

interface Vehicle 
{ 
    public function drive(); 
} 

class SportCar implements Vehicle 
{ 
    $speed = 'very fast'; 
    public function drive() 
    { 
     return ' is driving sport car'; 
    } 
} 

class LuxuryCar implements Vehicle 
{ 
    $speed = 'normal'; 
    public function drive() 
    { 
     return ' is driving luxury car'; 
    } 
} 

class DrivingApplication 
{ 
    public function __constructor($driverName, $carType) 
    { 
     $car = CarFactory::createCar($carType); //<------ HERE// 
     echo $driverName . $car->drive(); 
    } 
} 

$app = new DrivingApplication(); 

Таким образом, внутри класса DrivingApplication, я создал класс автомобиля с помощью CarFactory. Мой вопрос:

  • все еще предполагается плотная связь ??
  • Должен ли я создать объект автомобиля за пределами класса DrivingApplication и использовать инъекцию зависимостей для решения тесной связи?
  • что делать, если я могу определить только тип автомобиля для создания внутри класса DrivingApplication?
+0

Почему бы вам не назвать заводской класс «VehicleFactory»? Трудно ответить на ваш вопрос, не видя вызовы классов/кода. Это может быть более подходящий вопрос для codereview.stackexchange.com –

ответ

0

Ну, new должно называться где-то. Вы можете попробовать сделать его немного более динамичным, имея CarFactory::$classes массив, который отображает типы классам:

class CarFactory { 
    public static $classes = []; 
    public static function create ($type) { 
     $class = static::$classes[$type]; 
     return new $class(); 
    } 
} 

Затем вы можете добавить типы автомобилей во время выполнения.

CarFactory::$classes['foo'] = 'FooClass'; 
$foo = CarFactory::create('foo'); 
Смежные вопросы