如何将这个简单的工厂转换为工厂方法?

时间:2011-11-04 03:52:51

标签: php design-patterns factory

我问了一个问题“这是正确的工厂方法模式吗?” 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

如何将代码转换为工厂方法模式?

1 个答案:

答案 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。