当前位置: 首页 > 后端技术 > PHP

设计模式--原型模式

时间:2023-03-29 19:10:50 PHP

今天的文章,就来介绍一下原型模式。原型模式,通俗地说,就是让我们复制一个可定制的对象,而不必考虑对象的实际创建过程。举个例子:小明在最大的同性交友论坛上看到一个开源项目非常适合自己的新项目,然后下载了项目(可定制对象)拿来,然后修改里面的配置(对象定制业务),并开始开发。(1.这个例子够流行;2.最大的同性交友论坛是github~)这就是原型模式。我们看代码:首先我们需要一个原型:classArtimplementsPrototype{private$_name;公共函数__construct($name){$this->_name=$name;}/***设置名称**@param$name*/publicfunctionsetName($name){$this->_name=$name;}/***获取名称**@returnmixed*/publicfunctiongetName(){return$this->_name;}/***浅拷贝*/publicfunctionshallowCopy(){returnclone$this;}/***深拷贝*/publicfunctiondeepCopy(){//序列化对象$serialize_obj=serialize($this);//反序列化$clone_obj=unserialize($serialize_obj);返回$clone_obj;}}这个原型允许浅拷贝和深拷贝(记住这一点,我们稍后会讨论)。我们调用过程序:classClient{/***浅贝*/publicstaticfunctionshallow(){$cd=newCD();$cd->content="音乐";$music=newArt($cd);$movie=$music->shallowCopy();p('$music->getName()',$music->getName());p('$movie->getName()',$movie->getName());$cd->content="电影";p('$music->getName()',$music->getName());p('$movie->getName()',$movie->getName());}/***深贝*/publicstaticfunctiondeep(){$cd=newCD();$cd->content="音乐";$music=newArt($cd);$movie=$music->deepCopy();p('$music->getName()',$music->getName());p('$movie->getName()',$movie->getName());$cd->content="电影e";p('$music->getName()',$music->getName());p('$movie->getName()',$movie->getName());}}这包含ACD类,原型模式不需要这个类,我把它放在这里只是为了帮助你理解什么是浅拷贝和深拷贝(好人有平安~)CD类如下:classCD{public$content;}执行结果:*****$music->getName()=object(CD)#2(1){["content"]=>string(5)"music"}*******$movie->getName()=object(CD)#2(1){["content"]=>string(5)"music"}*******$music->getName()=object(CD)#2(1){["content"]=>string(5)"movie"}******$movie->getName()=object(CD)#2(1){["content"]=>string(5)"movie"}******$music->getName()=object(CD)#4(1){["content"]=>string(5)"music"}******$movie->getName()=object(CD)#5(1){["content"]=>string(5)"music"}*******$music->getName()=object(CD)#4(1){["content"]=>string(5)"movie"}*******$movie->getName()=object(CD)#5(1){["content"]=>string(5)"music"}本例中的电影是音乐对象的副本。在创建电影的过程中,不需要考虑电影对象的创建过程,只需要使用电影对象即可。同时,我们也注意到$movie->getName()和$music->getName()在结果上的区别,这涉及到其他需要注意的问题:浅拷贝和深拷贝;浅拷贝:复制的所有对象变量都包含与原始对象相同的值,并且对其他对象的引用(对象的地址)也一致。也就是说:浅拷贝只负责当前对象实例,不拷贝引用对象。所以当我们修改原来的音乐对象时,我们也会修改电影对象中对应的值。深拷贝:被复制对象的所有变量都包含与原始对象相同的值,但是那些引用其他对象的变量将指向一个复制的新对象,而不是原来引用的对象。即深拷贝将被拷贝对象引用的对象拷贝一次(也叫间接拷贝)。原型模式是先创建一个原型对象,然后通过克隆这个原型对象来创建一个新的对象。这种模式特别适合创建复杂的对象。如果一个复杂的对象每次new都会消耗很多,原型模式只需要内存拷贝即可。