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


Is this correct factory method 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();

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

区别在于,在工厂模式中,您有一个单独的工厂对象(DriveableFactory),而在工厂方法模式中,create()方法将是Driveable基类的成员。我不熟悉php,而且该模式似乎并不适用于您的具体场景,因此我无法在这里提供代码示例。

但无论如何,你必须区分这两种模式。我知道围绕它们有很多困惑,维基百科上关于工厂方法模式的条目就是完全错误的——在web上可以找到许多其他来源。但在这一点上最好做到准确,因为当你使用相同的词语时,沟通的意思是相同的,这是至关重要的……

HTH - Thomas

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

编辑 +1沉默的评论。应该是在codereview上的,没想到。