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 类中确定要创建的汽车类型怎么办?
4

1 回答 1

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');
于 2014-10-15T18:56:27.777 回答