摘要:原型设计模式中的构造函数使用创建新对象时,并不会触发类的构造函数。事实上,使用构造函数并不一定是一个好的设计,由于构造函数内的逻辑无法被外部控制,当需要修改一个类构造时的逻辑时,除了修改类的构造函数实现以外,别无他法,这破坏了类的封装。
Introduction原文地址:PHP设计模式(九):原型设计模式
在PHP设计模式(八):工厂模式中我们介绍了创建设计模式(Creation patterns)中的工厂模式,下面我们将介绍另一种原型设计模式(Prototype Method)。
在PHP中,原型设计模式依靠cloning复制对象来实现。通过cloning构造的对象,将大量节省新对象的构造时间。
简单来说,当你希望根据已有的对象来创建新对象时。
为什么会有这种需求?想象一下,你在做细胞分裂的项目,每一个细胞都是一个对象,现在你有一个细胞类,每一个新的细胞都是由这个类生成的,不同的细胞只是内部的状态参数不同。
当分裂到第N代的时候,已经和初代大不一样了,你是愿意使用第N代的副本修改一下呢?还是愿意从初代慢慢推演?
PHP提供了内建的__clone()函数以及clone关键字,来实现对象的复制。下面给出一个例子:
id = 1; $this->dna = "ATCG"; } public function displayDNA() { echo $this->dna . " "; } function __clone() { $this->id = $this->id + 1; if ($this->id % 3 == 0) { $this->dna = $this->dna . "AT"; } if ($this->id % 5 == 0) { $this->dna = $this->dna . "CG"; } } } $whaleCell = new WhaleCell(); $whaleCell->displayDNA(); $whaleCell2 = clone $whaleCell; $whaleCell2->displayDNA(); $whaleCell3 = clone $whaleCell2; $whaleCell3->displayDNA(); $whaleCell4 = clone $whaleCell3; $whaleCell4->displayDNA(); $whaleCell5 = clone $whaleCell4; $whaleCell5->displayDNA(); ?>
运行一下:
ATCG ATCG ATCGAT ATCGAT ATCGATCG
程序简单的模拟了DNA的遗传突变,每遗传三代,DNA增加AT,每遗传五代,DNA增加CG。
原型设计模式中的构造函数使用clone创建新对象时,并不会触发类的构造函数。这也是在使用原型设计模式中需要注意的一点。clone的底层实现并不是调用类的构造函数来创建一个类,而是直接拷贝一个类的地址空间,生成另一个类。这种直接拷贝也带来了高效。
事实上,使用构造函数并不一定是一个好的设计,由于构造函数内的逻辑无法被外部控制,当需要修改一个类构造时的逻辑时,除了修改类的构造函数实现以外,别无他法,这破坏了类的封装。
原型设计模式带来了另一种创建对象的思路,合理的使用cloning构造对象,将提高程序创建新对象时的效率。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/21674.html
摘要:开源的论坛网站开源的论坛源代码接口管理接口环境下环境一键安装软件二前端资源中国淘宝镜像在国内,由于墙的原因,安装包速度很慢,所以,这里建议使用淘宝提供的镜像安装前端资源。 为者常成,行者常至。 一、PHP资料 1、V2EX way to explore 分享和探索的地方2、Laravel China 中国最大的 Laravel 和 PHP 开发者社区3、Composer使用方法4、Pa...
摘要:开源的论坛网站开源的论坛源代码接口管理接口环境下环境一键安装软件二前端资源中国淘宝镜像在国内,由于墙的原因,安装包速度很慢,所以,这里建议使用淘宝提供的镜像安装前端资源。 为者常成,行者常至。 一、PHP资料 1、V2EX way to explore 分享和探索的地方2、Laravel China 中国最大的 Laravel 和 PHP 开发者社区3、Composer使用方法4、Pa...
摘要:我们通过一个简单的例子与图示,来了解构造函数,实例与原型三者之间的关系。而原型对象的指向构造函数。于是根据构造函数与原型的特性,我们就可以将在构造函数中,通过声明的属性与方法称为私有变量与方法,它们被当前被某一个实例对象所独有。 showImg(https://segmentfault.com/img/remote/1460000008593382); 如果要我总结一下学习前端以来我遇...
阅读 3640·2023-04-26 02:07
阅读 3150·2021-09-22 15:55
阅读 2534·2021-07-26 23:38
阅读 3119·2019-08-29 15:16
阅读 2008·2019-08-29 11:16
阅读 1746·2019-08-29 11:00
阅读 3583·2019-08-26 18:36
阅读 3165·2019-08-26 13:32