在大多数工厂的模式解释主题中,我们被告知工厂需要拒绝使用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。 对不起我的英文
答案 0 :(得分:0)
您链接的维基百科页面解释了原因:
Factory Method设计模式解决了以下问题:
如何创建对象以便子类可以重新定义要实例化的类?
如何将类推迟实例化为子类?
我个人在PHP中找到的最有用的工厂是实现库。这是一个观点问题,但我发现工厂通常在我的PHP应用程序的核心内部过多。但是在编写要由多个应用程序使用的库时,它可以在提供特定实现方面提供更大的灵活性。
您提供的示例将起作用,但不是实现该模式的最佳方式。制作一个实例化的具体工厂类通常会更好。或者甚至更好的接口,然后你实现。然后它更有用,也更容易进行单元测试。
答案 1 :(得分:0)
当动态确定对象的实际类型时,工厂模式很有用。
$carType = $_POST['type'];
$cat = CarAbstract::factory($carType);
这允许您在基类中实现一次switch
语句,而不必在使用这些类的所有应用程序中对其进行编码。如果添加更多子类,则只需更新一个switch
语句,而不必查找所有调用者。