专栏首页Lemon黄PHP设计模式——抽象方法

PHP设计模式——抽象方法

点击上方“Lemon黄”关注我哦,不定期原创文,定期好技术文推广分享

提供一个用于创建相关或依赖对象的接口,而无需指定其具体类。

Dragon公司的业务受到轰炸,而CEO希望特许所有海外分支机构的专营权。他首先要注意的问题是如何确保产品质量。他们不希望特许经营者削减成本和使用低质量的组件。低质量的玩具肯定会破坏Dragon品牌的声誉。因此,CEO希望将业务特许经营,但他们仍然希望每个地方都有工厂来提供组件。开发人员聚集起来,开始集思广益。玩具使用三种类型的组件。发动机,车轮和动叶片。例如,一辆玩具车需要一个发动机和四个轮,而玩具直升机则需要一个动叶片和一个发动机。

让我们首先创建一个抽象工厂类,它是所有具体工厂的基础。请注意,抽象工厂实质上由一组工厂方法组成:

//抽象工厂类
abstract class ComponentsFactory
{
    abstract function createEngine() ;//创建发动机
    abstract function createWheel() ;//创建车轮
    abstract function createRotorBlade() ;//创建动叶片
}

然后创建一个特定于地方的工厂(用于创建混凝土组件的混凝土工厂)。让我们为纽约创建一个:

class NyComponentsFactory extends ComponentsFactory
{
 
    public function createEngine()
    {
        return new NyEngine();
    }
 
    public function createWheel()
    {
        return new NyWheel();
    }
 
    public function createRotorBlade()
    {
        return new NyRotorBlade();
    }
}

玩具类(Toy)也需要修改。需要阐明发动机,车轮和转子叶片,并且prepare()函数需要抽象出来(此方法将由具体类来实现。在实现中,子类使用其特定于地方的c抽象工厂类(ComponentsFactory)来创建具体组件)。修改玩具类(Toy)如下:

abstract class Toy {
    public $name    = '';
    public $price   = 0;
    public $engine  = null;
    public $wheels  = array();
    public $rotorBlade = null;
    abstract function prepare() ;
    public function package()
    {
        echo $this->name. ' is packaged';
    }
 
    public function label()
    {
        echo $this->name . ' is priced at '.$this->price;
    }
}

接下来,让我们修改NyCar类和NyHelicopter类来实现prepare()方法:

class NyCar extends Toy
{
    public $name  = 'NyCar';
    public $price = 30;
    public $componentsFactory = null;
    public function  __construct(ComponentsFactory $componentsFactory)
    {
        $this->componentsFactory = componentsFactory;
    }
 
    public function prepare()
    {
        $this->engine   = $this->componentsFactory->createEngine();
        $this->wheels[] = $this->componentsFactory->createWheel();
        $this->wheels[] = $this->componentsFactory->createWheel();
        $this->wheels[] = $this->componentsFactory->createWheel();
        $this->wheels[] = $this->componentsFactory->createWheel();
    }
}
 
class NyHelicopter extends Toy
{
    public $name  = 'NyCar';
    public $price = 30;
    public $componentsFactory = null;
 
    public function  __construct(ComponentsFactory $componentsFactory)
    {
        $this->componentsFactory = componentsFactory;
    }
 
    public function prepare()
    {
        $this->engine      = $this->componentsFactory->createEngine();
        $this->rotorBlade  = $this->componentsFactory->createRotorBlade();
    }
}

最后,需要修改具体的ToysFactory的工厂方法。在此处添加特定于地方的ComponensFactory。让我们完成NyToysFactory的代码:

class NyToysFactory extends ToysFactory
{
    public function createToy($toyName)
    {
        $toy = null;
        $nyComponentsFactory = new NyComponentsFactory();
        if ('car'==$toyName) {
            $toy = new NyCar($nyComponentsFactory);
        } else if ('helicopter'==$toyName) {
            $toy = new NyHelicopter($nyComponentsFactory);
        }
        return $toy;
    }
}

现在,每个特许经营的专营权,都由Dragon公司总部控制的部件工厂来提供部件。

在这节中,我们建立以一个特许经营的框架,使Dragon公司拥有控制权,并未每个特许经营者提供足够的自由来做他们擅长的事情。

本文分享自微信公众号 - Lemon黄(lemonhunag),作者:Lemon黄

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP设计模式——状态模式

    John在一家受欢迎的电话支持公司中担任客户支持代表。在以客户服务为导向的公司中,公司的首要任务是确保客户满意。为了改善服务质量,该公司投入了大量资金来改善支持...

    Lemon黄
  • PHP设计模式——迭代模式

    作为商店经理,Eric的工作包括检修各个部门的产品。商店中实际上有两个部门。一个部门称为男士部门,该部门存放男性用品,另一个部门称为女士部门的女性用品。每个部门...

    Lemon黄
  • PHP设计模式——模板方法

    管理公司员工的日常行程可能是一项耗时的工作。如果可以使用程序将日常任务编程为自动发生,那将容易得多。Mark在Yahaa Inc工作了四年, 他是一名程序员,他...

    Lemon黄
  • 七夕最污代码,单身慎入

    2.找不到对象说爱(Fatal error: Call to a member function on a non-object), 他怎么才能说出爱?

    后端技术探索
  • java之子类对象实例化过程

    绝命生
  • 聊聊spring cloud netflix ribbon的eager load

    本文主要研究一下spring cloud netflix ribbon的eager load

    codecraft
  • 聊聊spring cloud netflix ribbon的eager load

    本文主要研究一下spring cloud netflix ribbon的eager load

    codecraft
  • 【php设计模式】代理模式

    主要解决在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控...

    码缘
  • PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解

    本文实例讲述了PHP设计模式之中介者模式(Mediator Pattern)。分享给大家供大家参考,具体如下:

    砸漏
  • java队列

    队列为特殊的线性表,队列的特点先进先出(FIFO),队列插入为入队,队列删除为出对。

    mySoul

扫码关注云+社区

领取腾讯云代金券