本篇文章给大家分享的是有关怎么在PHP中实现一个原型模式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
前言
原型模式其实更形象的来说应该叫克隆模式。它主要的行为是对对象进行克隆,但是又把被克隆的对象称之为最初的原型,于是,这个模式就这样被命名了。说真的,从使用方式来看真的感觉叫克隆模式更贴切一些。
Gof类图及解释
Gof定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
Gof类图
代码实现
abstract class 原型 {=,public v 美元;& # 39;克隆# 39;,只PHP_EOL; ,public function  __construct () ,{ echo & # 39;才能创建# 39;,只PHP_EOL; ,} ,abstract public function  __clone (); }
首先我们通过模拟的方式定义了一个原型,这里主要是模拟了__clone()这个方法。其实这是PHP自带的一个魔术方法,根本是不需要我们去进行定义的,只需要在原型类中进行实现就可以了。当外部使用克隆关键字进行对象克隆时,直接就会进入这个魔术方法中。在这个魔术方法里面我们可以对属性进行处理,特别是针对引用属性进行一些独特的处理。在这个例子中,我们只使用了一个值类型的变量。无法体现出引用类型的问题,我们将在后面的实例中演示对引用类型变量的处理。
class ConcretePrototype1 extends 原型 { ,public function  __clone () ,{ ,} } class ConcretePrototype2  extends 原型 { ,public function  __clone () ,{ ,} }
模拟的具体实现的原型,其实就是主要去具体的实现__clone()方法。后面我们看具体的例子时再说明。
class 客户端 { ,public function 操作() ,{ 时间=美元才能p1 new ConcretePrototype1 (); 时间=美元才能p2 clone p1美元; echo 才能;p1→美元v; echo 才能;p2→美元v; ,} } $ c =, new 客户端(); $ c→操作();
客户端使用克隆来复制P1可以看到p2也具有相同的美元v属性。
- <李>
原型模式看似就是复制了一个相同的对象,但是请注意,复制的时候,__construct()方法并没有被调用,也就是当你运行这段代码的时候,创建只输出了一次。这也就带出了原型模式最大的一个特点,减少创建对象时的开销。
李> <李>基于上述特点,我们可以快速的复制大量相同的对象,比如要给一个数组中塞入大量相同的对象时。
李> <李>复制出来的对象中如果都是值类型的属性,我们可以任意修改,不会对原型产生影响。而如果有引用类型的变量,则需要在__clone()方法进行一些处理,否则修改了复制对象的引用变量中的内容,会对原型对象中的内容有影响。
李>我们的手机操作系统(也可以想象一下电脑电脑的操作系统),都是怎样安装到设备中呢?其实都是不停的复制拷贝最初的那一套系统。用微软的例子非常好说明这个问题,当年微软能够成为一个帝国,其实也是因为他不停的将winodws操作系统拷贝复制到光盘中,然后卖给千家万户(当然,这里没中国什么事儿)。而中国市场呢,大量的高手破解了windows之后也是由这一份文件不停的复制拷贝才装到了我们的电脑中。手机,智能设备等各类产品的操作系统,软件都是如此。一次开发无限拷贝正是软件行业暴利的原因。毕竟我们的系统也是由不少的工程师日以继夜的996在Android原生系统的基础上开发出来的,赶紧不断的复制到即将出厂的手机上吧! !
完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/08.prototype/source/prototype.php
<强>实例强>
同样还是拿手机来说事儿,这次我们是根据不同的运营商需要去开发一批定制机,也就是套餐机。这批手机说实话都并没有什么不同,大部分都是相同的配置,但是运营商系统不同,而且偶尔有一些型号的CPU和内存也可能存在不同。这个时候,我们就可以用原型模式来进行快速的复制并且只修改一部分不相同的地方啦。