【问题标题】:using factory pattern and tight coupling使用工厂模式和紧耦合
【发布时间】:2014-12-10 23:08:33
【问题描述】:

我正在考虑使用工厂模式来创建不同的对象。但是如果通过工厂模式在另一个类中创建对象是否紧密耦合,我有点困惑。例如:

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

【问题讨论】:

  • 为什么不调用工厂类VehicleFactory?很难在没有看到调用类/代码的情况下回答您的问题。这实际上可能更适合 codereview.stackexchange.com 的问题

标签: php oop factory tightly-coupled-code


【解决方案1】:

嗯,new 必须被称为 somewhere。您可以尝试通过使用将类型映射到类的 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');

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多