如何应用工厂模式php

时间:2013-04-26 13:15:58

标签: php oop dependency-injection factory-pattern

我不确定如何应用工厂模式。

如果我以此代码为例:

class Car
{
    protected $_engine;
    protected $_frame;
    protected $_wheels;

    public function __construct($engine,$frame,$wheels)
    {
        $this->_engine = $engine;
        $this->_frame = $frame;
        $this->_wheels = $wheels;
    }
}

class Engine
{
    protected $_hp;

    public function __construct($hp)
    {
        $this->_hp = $hp;
    }
}

class Frame
{
    protected $_type;
    protected $_length;

    public function __construct($type,$length)
    {
        $this->_type = $type;
        $this->_length = $length;
    }
}

class Wheels
{
    protected $_diameter;

    public function __construct($diameter)
    {
        $this->_diameter = $diameter;
    }
}

class CarFactory
{
    // ???
}

工厂应该如何制造汽车的所有部件?我是否需要每个部件都有工厂?如果是这样,CarFactory如何了解它们? IOC,DI和工厂模式的结合让我感到困惑,应该启动一切或任何事情。我看到了所有这些的好处(我想)。

依赖注入如何在这里发挥作用?每个部分都可能是它自己的对象,但为了简单起见,我暂时将它留在了外面。

希望我的问题很清楚。

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果你有不同类型的汽车,你需要使用工厂。

class Car
{
    protected $type;

    public function drive()
    {
        echo 'Zoom-zoom!';
    }

    public static function factory($driven)
    {
        $instance = null;
        switch ($driven) {
            case 2:
                $instance = new Sedan;
                break;
            case 4:
                $instance = new Crossover;
                break;
            default:
                throw new Exception('Invalid driven type: ' . $driven);
        }

        return $instance;
    }
}

class Sedan extends Car
{
    // some things for sedan
}

class Crossover extends Car
{
    // some things for Crossover
}

$sedan = Car::factory(2);
$crossover = Car::factory(4);

$sedan->drive();
$crossover->drive();

类似的东西。