• 技术文章 >后端开发 >php教程

    一文了解PHP中的原型模式

    青灯夜游青灯夜游2021-07-07 19:30:44转载1259

    在之前的文章《浅谈PHP中的迭代器模式》中我们介绍了PHP中的迭代器模式,下面本篇文章带大家了解一下PHP中的原型模式。

    原型模式其实更形象的来说应该叫克隆模式。它主要的行为是对对象进行克隆,但是又把被克隆的对象称之为最初的原型,于是,这个模式就这样被命名了。说真的,从使用方式来看真的感觉叫克隆模式更贴切一些。

    Gof类图及解释

    GoF定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

    GoF类图:

    原型模式

    代码实现:

    abstract class Prototype
    {
        public $v = 'clone' . PHP_EOL;
    
        public function __construct()
        {
            echo 'create' . PHP_EOL;
        }
    
        abstract public function __clone();
    }

    首先我们通过模拟的方式定义了一个原型,这里主要是模拟了__clone()这个方法。其实这是PHP自带的一个魔术方法,根本是不需要我们去进行定义的,只需要在原型类中进行实现就可以了。当外部使用clone关键字进行对象克隆时,直接就会进入这个魔术方法中。在这个魔术方法里面我们可以对属性进行处理,特别是针对引用属性进行一些独特的处理。在这个例子中,我们只使用了一个值类型的变量。无法体现出引用类型的问题,我们将在后面的实例中演示对引用类型变量的处理。

    class ConcretePrototype1 extends Prototype
    {
        public function __clone()
        {
        }
    }
    
    class ConcretePrototype2 extends Prototype
    {
        public function __clone()
        {
        }
    }

    模拟的具体实现的原型,其实就是主要去具体的实现__clone()方法。后面我们看具体的例子时再说明。

    class Client
    {
        public function operation()
        {
            $p1 = new ConcretePrototype1();
            $p2 = clone $p1;
    
            echo $p1->v;
            echo $p2->v;
        }
    }
    
    $c = new Client();
    $c->operation();

    客户端使用clone来复制p2也具有相同的$v属性。

    我们的手机操作系统(也可以想象一下PC电脑的操作系统),都是怎样安装到设备中呢?其实都是不停的复制拷贝最初的那一套系统。用微软的例子非常好说明这个问题,当年微软能够成为一个帝国,其实也是因为他不停的将winodws操作系统拷贝复制到光盘中,然后卖给千家万户(当然,这里没中国什么事儿)。而中国市场呢,大量的高手破解了windows之后也是由这一份文件不停的复制拷贝才装到了我们的电脑中。手机、智能设备等各类产品的操作系统、软件都是如此。一次开发无限拷贝正是软件行业暴利的原因。毕竟我们的系统也是由不少的工程师日以继夜的996在Android原生系统的基础上开发出来的,赶紧不断的复制到即将出厂的手机上吧!!

    完整代码:https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhangyue0503%2Fdesignpatterns-php%2Fblob%2Fmaster%2F08.prototype%2Fsource%2Fprototype.php

    实例

    同样还是拿手机来说事儿,这次我们是根据不同的运营商需要去开发一批定制机,也就是套餐机。这批手机说实话都并没有什么不同,大部分都是相同的配置,但是运营商系统不同,而且偶尔有一些型号的CPU和内存也可能存在不同。这个时候,我们就可以用原型模式来进行快速的复制并且只修改一部分不相同的地方啦。

    原型模式生产手机类图:

    2.gif

    完整源码:https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhangyue0503%2Fdesignpatterns-php%2Fblob%2Fmaster%2F08.prototype%2Fsource%2Fprototype-phone.php
    <?php
    interface ServiceProvicer
    {
        public function getSystem();
    }
    
    class ChinaMobile implements ServiceProvicer
    {
        public $system;
        public function getSystem(){
            return "中国移动" . $this->system;
        }
    }
    class ChinaUnicom implements ServiceProvicer
    {
        public $system;
        public function getSystem(){
            return "中国联通" . $this->system;
        }
    }
    
    class Phone 
    {
        public $service_province;
        public $cpu;
        public $rom;
    }
    
    class CMPhone extends Phone
    {
        function __clone()
        {
            // $this->service_province = new ChinaMobile();
        }
    }
    
    class CUPhone extends Phone
    {
        function __clone()
        {
            $this->service_province = new ChinaUnicom();
        }
    }
    
    
    $cmPhone = new CMPhone();
    $cmPhone->cpu = "1.4G";
    $cmPhone->rom = "64G";
    $cmPhone->service_province = new ChinaMobile();
    $cmPhone->service_province->system = 'TD-CDMA';
    $cmPhone1 = clone $cmPhone;
    $cmPhone1->service_province->system = 'TD-CDMA1';
    
    var_dump($cmPhone);
    var_dump($cmPhone1);
    echo $cmPhone->service_province->getSystem();
    echo $cmPhone1->service_province->getSystem();
    
    
    $cuPhone = new CUPhone();
    $cuPhone->cpu = "1.4G";
    $cuPhone->rom = "64G";
    $cuPhone->service_province = new ChinaUnicom();
    $cuPhone->service_province->system = 'WCDMA';
    $cuPhone1 = clone $cuPhone;
    $cuPhone1->rom = "128G";
    $cuPhone1->service_province->system = 'WCDMA1';
    
    var_dump($cuPhone);
    var_dump($cuPhone1);
    echo $cuPhone->service_province->getSystem();
    echo $cuPhone1->service_province->getSystem();

    说明:

    原文地址:https://juejin.cn/post/6844903942220939272

    作者:硬核项目经理

    推荐学习:《PHP视频教程

    以上就是一文了解PHP中的原型模式的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    上一篇:PHP数组合并方法:array_merge VS array_push VS 元素追加 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 浅谈PHP中的装饰器模式• 一文了解PHP中的适配器模式• 一招解决 PHP 单例模式解析和实战• 深入浅析PHP中的观察者模式• 浅谈PHP中的迭代器模式
    1/1

    PHP中文网