发布于2021-03-14 06:06 阅读(1445) 评论(0) 点赞(2) 收藏(1)
原型模式其实更形象的来说应该叫克隆模式。它主要的行为是对对象进行克隆,但是又把被克隆的对象称之为最初的原型,于是,这个模式就这样被命名了。说真的,从使用方式来看真的感觉叫克隆模式更贴切一些。
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来复制$p1,可以看到$p2也具有相同的$v属性。
我们的手机操作系统(也可以想象一下PC电脑的操作系统),都是怎样安装到设备中呢?其实都是不停的复制拷贝最初的那一套系统。用微软的例子非常好说明这个问题,当年微软能够成为一个帝国,其实也是因为他不停的将winodws操作系统拷贝复制到光盘中,然后卖给千家万户(当然,这里没中国什么事儿)。而中国市场呢,大量的高手破解了windows之后也是由这一份文件不停的复制拷贝才装到了我们的电脑中。手机、智能设备等各类产品的操作系统、软件都是如此。一次开发无限拷贝正是软件行业暴利的原因。毕竟我们的系统也是由不少的工程师日以继夜的996在Android原生系统的基础上开发出来的,赶紧不断的复制到即将出厂的手机上吧!!
完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/08.prototype/source/prototype.php
同样还是拿手机来说事儿,这次我们是根据不同的运营商需要去开发一批定制机,也就是套餐机。这批手机说实话都并没有什么不同,大部分都是相同的配置,但是运营商系统不同,而且偶尔有一些型号的CPU和内存也可能存在不同。这个时候,我们就可以用原型模式来进行快速的复制并且只修改一部分不相同的地方啦。
原型模式生产手机类图
<?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();
说明
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料
知乎、公众号、抖音、头条搜索【硬核项目经理】
B站ID:482780532
作者:gogogo
链接:http://www.phpheidong.com/blog/article/2953/bf1feb820dd87fb7c669/
来源:php黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 php黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-4
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!