工厂设计模式说明

时间:2018-01-12 20:59:39

标签: php design-patterns factory factory-pattern

在大多数工厂的模式解释主题中,我们被告知工厂需要拒绝使用new来实例化对象。相反,我们需要使用new实例化工厂,为我们的具体对象执行new

但为什么呢?在那种情况下,我们只有过多的中产阶级。 For example here

在我的代码中我使用这种方式。是工厂吗?这是对的吗?

    <?php

abstract class CarAbstract
{

    abstract public function makeSignal();

    public static function factory($type)
    {
        switch($type) {
            'automobile':
                return new AutoCar();
                break;
            'truck':
                return new TruckCar();
                break;
        }
    }
}

class AutoCar extends CarAbstract {

    public function makeSignal()
    {
        return 'beep-beep';
    }
}

class TruckCar extends CarAbstract {

    public function makeSignal()
    {
        return 'faa-faa';
    }
}

$auto = CarAbstract::factory('automobile');
$truck = CarAbstract::factory('truck');

$auto->makeSignal(); // beep-beep
$truck->makeSignal(); // faa-faa

P.S。 对不起我的英文

2 个答案:

答案 0 :(得分:0)

您链接的维基百科页面解释了原因:

  

Factory Method设计模式解决了以下问题:

     

如何创建对象以便子类可以重新定义要实例化的类?

     

如何将类推迟实例化为子类?

我个人在PHP中找到的最有用的工厂是实现库。这是一个观点问题,但我发现工厂通常在我的PHP应用程序的核心内部过多。但是在编写要由多个应用程序使用的库时,它可以在提供特定实现方面提供更大的灵活性。

您提供的示例将起作用,但不是实现该模式的最佳方式。制作一个实例化的具体工厂类通常会更好。或者甚至更好的接口,然后你实现。然后它更有用,也更容易进行单元测试。

答案 1 :(得分:0)

当动态确定对象的实际类型时,工厂模式很有用。

$carType = $_POST['type'];
$cat = CarAbstract::factory($carType);

这允许您在基类中实现一次switch语句,而不必在使用这些类的所有应用程序中对其进行编码。如果添加更多子类,则只需更新一个switch语句,而不必查找所有调用者。