2011-11-02 115 views
0

我知道有很多类似的问题,但我不明白大多数这些问题,因为我不知道我是否知道工厂方法模式是什么..这是正确的工厂方法模式吗?

so..after read many网络,我想出了以下简单的类。

我做得对吗?

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

应该在http://codereview.stackexchange .com/ – ariefbayu

+0

@silent //啊...谢谢!!不知道stackexchange有codereview网站。 – Moon

+0

没问题,只是帮助推广其他堆栈交换 – ariefbayu

回答

2

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

编辑 +1对于沉默的评论。确实应该在coderewiew上,没有想到这一点。

+0

mAu // ahhhh太棒了......终于明白了! – Moon

3

要确切:这是一个工厂模式,而不是一个工厂方法图案

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

但无论如何,你必须区分这两种模式。我知道他们周围有很多混乱,维基百科条目工厂方法模式只是错误的 - 在网上可以找到很多其他来源。但最好能在这个确切的,因为它是必不可少的沟通,意味着同样的事情,当你使用同样的话......

HTH - 托马斯

+0

托马斯韦勒//你能详细解释一下吗?如果维基百科条目不正确,我认为我不能在其他地方找到更好的答案。 – Moon