这是正确的工厂方法模式吗?

时间:2011-11-02 07:26:14

标签: php factory-pattern

我知道有很多类似的问题,但我不理解大多数问题,因为我不确定我是否知道工厂方法模式是什么。

所以......在网上阅读了很多例子之后,我想出了以下简单的类。

我是否正确地做到了?

abstract class Driveable
{
    abstract public function start();
    abstract public function stop();

}

class CoupeDriveable extends Driveable
{
    public function start()
    {
    }

    public function stop()
    {
    }
}

class MotorcycleDriveable extends Driveable
{
    public function start()
    {
    }

    public function stop()
    {
    }   
}

class SedanDriveable extends Driveable
{
    public function start()
    {
    }

    public function stop()
    {
    }   
}

class DriveableFactory
{
    static public function create($numberOfPeople){

        if( $numberOfPeople == 1 )
        {
            return new MotorcycleDriveable;
        }       
        elseif( $numberOfPeople == 2 )
        {
            return new CoupleDriveable;
        }
        elseif( $numberOfPeople >= 3 && $numberOfPeople < 4)
        {
            return SedanDriveable;
        }
    }
}


class App
{
    static public function getDriveableMachine($numberOfPeople)
    {
        return DriveableFactory::create($numberOfPeople);
    }
}


$DriveableMachine = App::getDriveableMachine(2);
$DriveableMachine->start();

2 个答案:

答案 0 :(得分:3)

确切地说:这是工厂模式,而不是工厂方法模式

不同之处在于,在Factory模式中,您有一个单独的工厂对象(DriveableFactory),而在Factory方法模式中,create()方法将是Driveable的成员基类。我不熟悉php,这个模式似乎不适用于你的具体场景,所以我不能在这里给你一个代码示例。

但无论如何,你必须区分这两种模式。我知道围绕它们存在很多混淆,工厂方法模式的维基百科条目是完全错误的 - 在网上可以找到很多其他来源。但最好还是准确一点,因为当你使用相同的词时,沟通对于同样的事情是必不可少的......

HTH - 托马斯

答案 1 :(得分:2)

是。这是factory method模式的正确实现。

修改 +1以获取无声评论。确实应该在coderewiew上,没想过。