我问了一个问题“这是正确的工厂方法模式吗?” Is this correct factory method pattern?
和..然后......根据评论者的建议在codereview.stackexchange.com上提出了同样的问题。 https://codereview.stackexchange.com/questions/5752/is-this-correct-factory-method-pattern
所以...三个人说..我的代码是工厂方法,但是用户指出我的代码实际上是一个简单的工厂。
当我继续阅读网络上的其他例子时,我开始认为我的代码实际上是一个简单的工厂。
我的代码:
https://codereview.stackexchange.com/questions/5752/is-this-correct-factory-method-pattern
如何将代码转换为工厂方法模式?
答案 0 :(得分:1)
你实际上在你的例子中使用了一个简单的工厂,它看起来很好。有了这些要求,就没有必要去工厂方法模式。
但是我会尝试在这种情况下解释工厂方法。根据定义:
工厂方法模式定义了用于创建对象的接口,但让子类决定实例化哪个类。 Factory Method允许类将实例化延迟到 子类。
所以基本上你会有一个抽象工厂类,它定义了具体工厂中可用的创建方法,后者将决定要创建哪些具体对象。
我可以在你的场景中想到一个例子。让我们说你有不同品牌的Drivables(比如宝马和本田)。所以你会有像BMWCoupeDrivable,
BMWMotorcycleDrivable, BMWSedanDrivable, HondaCoupeDrivable, HondaMotorcycleDrivable, HondaSedanDrivable
这样的课程。您可能还会在将来添加更多品牌。在这种情况下,你很可能
最好使用工厂方法。
abstract class DriveableFactory
{
abstract public function create($numberOfPeople);
//-- Other methods here which manipulate the drivable
//-- e.g. testDrive()
}
class BMWDriveableFactory extends DriveableFactory
{
public function create($numberOfPeople){
if( $numberOfPeople == 1 )
{
return new BMWMotorcycleDriveable;
}
elseif( $numberOfPeople == 2 )
{
return new BMWCoupleDriveable;
}
elseif( $numberOfPeople >= 3 && $numberOfPeople < 4)
{
return BMWSedanDriveable;
}
}
}
class HondaDriveableFactory extends DriveableFactory
{
public function create($numberOfPeople){
if( $numberOfPeople == 1 )
{
return new HondaMotorcycleDriveable;
}
elseif( $numberOfPeople == 2 )
{
return new HondaCoupleDriveable;
}
elseif( $numberOfPeople >= 3 && $numberOfPeople < 4)
{
return HondaSedanDriveable;
}
}
}
为了更好的解释,我建议阅读Head First Design Pattern。