我想知道this tutorial是否在php中正确实现了工厂设计模式。下面是实际的源代码。

<?php
class Automobile
{
    private $vehicle_make;
    private $vehicle_model;

    public function __construct($make, $model)
    {
        $this->vehicle_make = $make;
        $this->vehicle_model = $model;
    }

    public function get_make_and_model()
    {
        return $this->vehicle_make . ' ' . $this->vehicle_model;
    }
}

class AutomobileFactory
{
    public static function create($make, $model)
    {
        return new Automobile($make, $model);
    }
}

// have the factory create the Automobile object
$veyron = AutomobileFactory::create('Bugatti', 'Veyron');

print_r($veyron->get_make_and_model()); // outputs "Bugatti Veyron"

根据四人帮的《设计模式》一书,工厂模式的适用性是
类不能预期它必须创建的对象的类
类希望其子类指定它创建的对象
类将责任委托给几个helper子类中的一个,并且您希望本地化哪个helper子类是委托的知识。
第一点,这个例子实际上知道要创建什么类的对象,即Automobile,不是吗?
第二点,没有子类。Automobile类不是从AutomobileFactory继承的。我认为automobilefactory至少应该有一个由automobile实现的函数,它处理对象创建。
有人能澄清一下吗?我刚开始学习设计模式,每次遇到不同于别人的教程,我都会感到困惑。

最佳答案

我非常同意维基百科上的说法
对象的创建排除了它的重用,而不会导致代码的重大重复。
创建对象需要访问不应包含在组合类中的信息或资源。
生成对象的生存期管理必须集中,以确保应用程序内的一致行为。
我创建工厂的主要原因是我强调了这一点。
例如,让我们想象一个真实世界的工厂,在全国有许多工厂。这家工厂生产门。门需要把手。由于物流的原因,工厂的每个工厂都有自己的旋钮供应商,另一个完全不同的工厂。
这个工厂的生产管理软件将根据一些标准来选择哪个工厂将生产大量的门,但它不需要知道旋钮从哪里来。选定的工厂将要求自己的供应商为生产的门提供一个旋钮。
然而,对于客户来说,不管是哪家工厂做的门,他只关心自己的门。
让我们把这个放在代码上:

class Knob {
    // something...
}

interface KnobSupplier {
    public function makeKnob();
}

class SaoPauloKnobSupplier {
    public function makeKnob() {
        return new Knob('Knob made in São Paulo');
    }
}

class NewYorkKnobSupplier {
    public function makeKnob() {
        return new Knob('Knob made in New York');
    }
}

class Door {
    public function __construct(Knob $knob) {
        // something...
    }
}

interface DoorFactory {
    public function makeDoor();
}

class SaoPauloDoorFactory {
    private $knobSupplier;

    public function __construct() {
        $this->knobSupplier = new SaoPauloKnobSupplier();
    }

    public function makeDoor() {
        return new Door($this->knobSupplier->makeKnob(), "Door made in São Paulo");
    }
}

class NewYorkDoorFactory {
    private $knobSupplier;

    public function __construct() {
        $this->knobSupplier = new NewYorkKnobSupplier();
    }

    public function makeDoor() {
        return new Door($this->knobSupplier->makeKnob(), "Door made in New York");
    }
}

class ProductionManager {
    private $plants = array();
    // methods for adding plants, etc...
    public function getDoor() {
        // Somehow decides which plant will create the door.
        return $plant->makeDoor();
    }
}

class Client {
    public function getMyDoor(ProductionManager $manager) {
        return $manager->getDoor();
    }
}

使用以下代码:
$manager = new ProductManager();
$manager->addPlant(new SaoPauloDoorFactory());
$manager->addPlant(new NewYorkDoorFactory());

$client  = new Client();

var_dump($client->getMyDoor($manager));

ProductManager不知道旋钮,Client不知道工厂有多个工厂。

10-02 19:26