前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP设计模式——抽象方法

PHP设计模式——抽象方法

作者头像
Lemon黄
发布2019-11-06 18:58:23
3820
发布2019-11-06 18:58:23
举报
文章被收录于专栏:Lemon黄Lemon黄

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

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

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

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

代码语言:javascript
复制
//抽象工厂类
abstract class ComponentsFactory
{
    abstract function createEngine() ;//创建发动机
    abstract function createWheel() ;//创建车轮
    abstract function createRotorBlade() ;//创建动叶片
}

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

代码语言:javascript
复制
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)如下:

代码语言:javascript
复制
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()方法:

代码语言:javascript
复制
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的代码:

代码语言:javascript
复制
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公司拥有控制权,并未每个特许经营者提供足够的自由来做他们擅长的事情。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lemon黄 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档