【问题标题】:Factory Design Pattern Explanation工厂设计模式说明
【发布时间】:2018-01-12 20:59:39
【问题描述】:

在大多数工厂的模式解释主题中,我们被告知工厂需要拒绝使用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

附: 对不起我的英语

【问题讨论】:

  • 工厂设计主要是为了Testability(单元测试)
  • 请在此处发布您的实际代码,而不是指向您的代码的链接。

标签: php design-patterns factory factory-pattern


【解决方案1】:

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

工厂方法设计模式解决了以下问题:

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

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

就我个人而言,我在工厂的 PHP 中发现的最有用的情况是实现库时。这是一个见仁见智的问题,但我发现工厂通常在我的 PHP 应用程序的核心中过多。但是,当编写一个供多个应用程序使用的库时,它在提供特定实现方面提供了更大的灵活性。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 是的。现在我这样做了
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多