gpt4 book ai didi

PHP工厂设计模式方法说明

转载 作者:可可西里 更新时间:2023-10-31 22:44:40 26 4
gpt4 key购买 nike

我想知道是否 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"

根据四人帮的一本书《设计模式》,工厂模式的适用性是

  • 一个类不能预测它必须创建的对象类
  • 一个类希望它的子类指定它创建的对象
  • 类将责任委托(delegate)给几个辅助子类之一,并且您想本地化关于哪个辅助子类是委托(delegate)的知识

首先,这个例子实际上知道要创建什么类的对象,也就是 Automobile,不是吗?

第二点,没有子类。 Automobile 类不继承自 AutomobileFactory。我认为 AutomobileFactory 应该至少有一个由 Automobile 实现的函数,它处理对象创建。

有人可以澄清一下吗?刚开始学习设计模式,每次遇到和别人不一样的教程,就很迷茫。

最佳答案

我非常同意维基百科的说法

  • The creation of an object precludes its reuse without significant duplication of code.
  • The creation of an object requires access to information or resources that should not be contained within the composing class.
  • The lifetime management of the generated objects must be centralized to ensure a consistent behavior within the application.

我创建工厂的主要原因是我强调的这一点。

例如,让我们想象一个真实世界的工厂,在全国各地都有许多工厂。这家工厂生产。门需要 Handlebars 。出于物流原因,工厂的每个工厂都有自己的旋钮供应商,另一个完全不同的工厂。

该工厂的生产经理软件将根据一些标准来选择哪个工厂将生产大量的门,但它不需要知道 Handlebars 从哪里来。被选中的工厂会要求自己的供应商为生产的门提供 Handlebars 。

但是,对于客户来说,门是用什么植物做的并不重要,他只关心有没有他的门。

让我们把它放在代码中:

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 对拥有多个工厂的工厂一无所知。

关于PHP工厂设计模式方法说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16524418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com