一千萬個為什麽

搜索

這是正確的工廠方法模式嗎?


我知道有很多類似的問題,但我不理解大多數這些問題,因為我不確定我是否知道工廠方法模式是什麽。 所以,在通過網絡閱讀了很多例子之後,我想出了以下簡單的類。 我做得對嗎?如果是這樣......我可以添加任何改進嗎? 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();

Update: according to palacsint and serghei's valueable advices, I've updated my code. abstract class DriveableFactory { static public function create($numberOfPeople); }

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

    $products = array
    (
        1=>"MotorcycleDriveable",
        2=>"CoupeDriveable",
        3=>"SedanDriveable",
        4=>"SedanDriveable"
    );

    if( isset( $products[$numberOfPeople] ) )
    {
        return new $products[$numberOfPeople];
    }
    else
    {
        throw new Exception("unable to find a suitable drivable car");
    }


}

}

最佳答案

Fac至ry方法Pattern的本質是“定義一個接口   用於創建對象,但讓子類決定使用哪個類   實例。 Fac至ry方法允許類將實例化延遲到   子類“。

如果您堅持上述 GoF定義,則有兩個問題。 首先,您應該創建 DriveableFac至ry 接口,並將 DriveableFac至ry 重命名為(例如) CarDriveableFac至ry 。 abstract class DriveableFac至ry { static public function create($numberOfPeople); }

class CarDriveableFac至ry extends DriveableFac至ry { static public function create($numberOfPeople) { ... } }

但是你的代碼很好,如果你不需要(沒有理由)抽象 DriveableFac至ry 接口不要將它添加到代碼中。 第二個問題是 create 方法不應該是 static 。如果是 static ,則子類不能覆蓋 create 方法。 最後, App 類看起來不必要。所以,我寫的是這樣的: DriveableFac至ry fac至ry = new CarDriveableFac至ry(); $DriveableMachine = fac至ry->getDriveableMachine(2); $DriveableMachine->start();

一些小的改進: 3.5 is an allowed value? And 3.1415? If not consider changing else if( $numberOfPeople >= 3 && $numberOfPeople < 4)

至 else if($numberOfPeople == 3 || $numberOfPeople == 4)

在 create()方法的最後一行,我將使用消息“invalid value:”拋出 IllegalArgumentException (或PHP中的類似代碼)。 $ numberOfPeople </代碼>。

轉載註明原文: 這是正確的工廠方法模式嗎?

猜你喜歡