ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

PHP工厂设计模式方法澄清

2019-05-29 14:17:55  阅读:285  来源: 互联网

标签:php design-patterns factory factory-pattern


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

根据Gang of Four的一本书“设计模式”,工厂模式的适用性是

>一个类无法预测它必须创建的对象类
>一个类希望其子类指定它创建的对象
> classes将责任委托给几个辅助子类之一,并且您希望本地化哪个辅助子类是委托的知识

第一点,这个例子实际上知道要创建什么类的对象,哪个是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.

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

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

该工厂的生产经理软件将根据一些标准选择哪个工厂将生产许多门,但不需要知道旋钮将来自何处.选定的工厂将要求自己的供应商提供生产门的旋钮.

然而,对于客户来说,哪个工厂开门并不重要,他只关心自己的门.

我们把它放在代码上:

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对旋钮一无所知,客户对具有多个工厂的工厂一无所知.

标签:php,design-patterns,factory,factory-pattern
来源: https://codeday.me/bug/20190529/1178364.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有