PHP设计模式-原型模式

适用性

原型设计模式创建对象的方式是复制和克隆初始对象或原型,这种方式比创建新实例更为有效。

UML

MyOject 类组合使用了原型设计模式。这个类具有名为 requestClone() 的公共方法,该方法用于生产 MyObject 实例的一个副本。

CloneObject 对象表示 MyObject 的复制实例。需要注意的是,因为该对象实际是一个复制品,所有它具有 requestClone()方法。

通过调用MyObject 的 requestClone() 方法,可以创建 CloneObject 的许多实例。

代码示例

音乐销售 Wed 站点允许登录站点的艺术家创建许多乐队的音乐“合辑”。目前,这种功能性还限制为所有有效的音轨只能来自一个乐队。为了开始创建CD“合辑”,我们可以采用多种途径。其中,在访问者查看某乐队的CD 页面的时候可以使用最通用的选项。CD页面存在的某个链接能够启动构建新CD“合辑”的进程,该进程会发送一个ID,这个ID对应于乐队的特定CD。

上面这个进程的第一个构建代码块是CD类。通类,为了构建CD对象,需要从数据库中检索出与被请求ID匹配的具体信息:

classCD{public$band='';public$tranckList=array();publicfunction_construct($id){$handle=mysql_connect('localhost','user','pass');mysql_select_db('cd',$handle);$query="select band , title from CDs where id={$id}";$resulte=mysql_query($query,$handle);if($row=mysql_fetch_array($resulte)){$this->band=$row['band'];$this->title=$row['title'];}}publicfunctionbuy(){//cd buying magic here echo'<pre>';var_dump($this);}}

这个类具有标砖的公共属性 $band $title $trackList 

构造函数接受 $id 参数 ID ,并且针对数据库执行查询。当发现指定ID时,相对应乐队和标题会分别指派给公共属性 $band 和 $title .

此外,CD类还增加了一个 buy() 函数。在最后的代码中,该方法可以处理CD 对象提供用于购买。

下一个需要创建的类代表混合CD 实体。这种特点的对象利用了PHP 的克隆能力:

classMixtapeCDextendsCD{publicfunction__clone(){$this->title='Mixtape';}}

MixtapeCD 实际只是一种特殊化CD , 扩展了CD 对象。

执行PHP 的 clone 命令是,就会对指定的对象执行 _clone() 方法。在MixtapeCD 对象中,初始CD的属性被重写。这个 MixtapeCD 对象不再对应于一个乐队和标题的CD 组合。此时,该对象关联 $band , 但具有新的标题 Mixtape 。

下面展示了某用户基于制定乐队制定两个混合标题的情况:

$externalPurchaseInfoBandID=12;$bandMixProto=newMixtapeCD($externalPurchaseInfoBandID);$externalPurchaseInfo=array();$externalPurchaseInfo[]=array('brrr','goodbye');$externalPurchaseInfo[]=array('what it means','brrr');foreach($externalPurchaseInfoas$mixed){$cd=clone$bandMixProto;$cd->trackList=$mixed;$cd->buy();}

$bandMixProto 对象根据 MixtapeCD 的新实例创建的。 传递该对象的参数 $extemalPuchaseInfoBandID 被用于实际 CD类构造函数执行的查询。

一旦创建了原型,就能够循环遍历用于特定访问者的CD合辑的音轨列表。对于 foreach() 循环的每个实例来说, $cd 都指派给 $bandMixProto 新副本。接下来特定曲目列表会被添加指定的对象。因为使用了克隆技术,所以每个新的循环都不需要针对数据库新查询。克隆对象已经存储了所有信息,最后,通过执行方法 buy() 就可以购买制定的 $cd 对象。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype模式允许一个对象再创建另外一个可...
    中v中阅读 403评论 0 0
  • 原型模式(Prototype Pattern):与工厂模式类似,都是用来创建对象的。利用克隆来生成一个大对象,减少...
    程序员祝融阅读 631评论 0 1
  • 适用性 工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类的步骤。 UML 代码...
    木有sky阅读 423评论 0 0
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,912评论 0 3
  • 0502阅读碎碎念和日报体会: 001关于幸福,送上祝福。 002给人生做减法。做减法不是一味的减减减,觉得应该是...
    王彩琼阅读 69评论 0 0

友情链接更多精彩内容