с использованием заводского шаблона и жесткой муфты

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

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??

person agthumoe    schedule 15.10.2014    source источник
comment
Почему бы вам не назвать фабричный класс VehicleFactory? Трудно ответить на ваш вопрос, не видя вызывающие классы/код. На самом деле это может быть лучше подходящий вопрос для codereview.stackexchange.com   -  person Mike Brant    schedule 15.10.2014


Ответы (1)


Что ж, 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');
person y o    schedule 15.10.2014