资讯专栏INFORMATION COLUMN

PHP设计模式(九):原型设计模式

warnerwu / 1986人阅读

摘要:原型设计模式中的构造函数使用创建新对象时,并不会触发类的构造函数。事实上,使用构造函数并不一定是一个好的设计,由于构造函数内的逻辑无法被外部控制,当需要修改一个类构造时的逻辑时,除了修改类的构造函数实现以外,别无他法,这破坏了类的封装。

原文地址:PHP设计模式(九):原型设计模式

Introduction

在PHP设计模式(八):工厂模式中我们介绍了创建设计模式(Creation patterns)中的工厂模式,下面我们将介绍另一种原型设计模式(Prototype Method)。
在PHP中,原型设计模式依靠cloning复制对象来实现。通过cloning构造的对象,将大量节省新对象的构造时间。

何时使用原型设计模式?

简单来说,当你希望根据已有的对象来创建新对象时。
为什么会有这种需求?想象一下,你在做细胞分裂的项目,每一个细胞都是一个对象,现在你有一个细胞类,每一个新的细胞都是由这个类生成的,不同的细胞只是内部的状态参数不同。
当分裂到第N代的时候,已经和初代大不一样了,你是愿意使用第N代的副本修改一下呢?还是愿意从初代慢慢推演?

Example

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的底层实现并不是调用类的构造函数来创建一个类,而是直接拷贝一个类的地址空间,生成另一个类。这种直接拷贝也带来了高效。
事实上,使用构造函数并不一定是一个好的设计,由于构造函数内的逻辑无法被外部控制,当需要修改一个类构造时的逻辑时,除了修改类的构造函数实现以外,别无他法,这破坏了类的封装。

Summary

原型设计模式带来了另一种创建对象的思路,合理的使用cloning构造对象,将提高程序创建新对象时的效率。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21674.html

相关文章

  • 月光宝盒之网站资源收录

    摘要:开源的论坛网站开源的论坛源代码接口管理接口环境下环境一键安装软件二前端资源中国淘宝镜像在国内,由于墙的原因,安装包速度很慢,所以,这里建议使用淘宝提供的镜像安装前端资源。 为者常成,行者常至。 一、PHP资料 1、V2EX way to explore 分享和探索的地方2、Laravel China 中国最大的 Laravel 和 PHP 开发者社区3、Composer使用方法4、Pa...

    learning 评论0 收藏0
  • 月光宝盒之网站资源收录

    摘要:开源的论坛网站开源的论坛源代码接口管理接口环境下环境一键安装软件二前端资源中国淘宝镜像在国内,由于墙的原因,安装包速度很慢,所以,这里建议使用淘宝提供的镜像安装前端资源。 为者常成,行者常至。 一、PHP资料 1、V2EX way to explore 分享和探索的地方2、Laravel China 中国最大的 Laravel 和 PHP 开发者社区3、Composer使用方法4、Pa...

    2bdenny 评论0 收藏0
  • 月光宝盒之网站资源收录

    摘要:开源的论坛网站开源的论坛源代码接口管理接口环境下环境一键安装软件二前端资源中国淘宝镜像在国内,由于墙的原因,安装包速度很慢,所以,这里建议使用淘宝提供的镜像安装前端资源。 为者常成,行者常至。 一、PHP资料 1、V2EX way to explore 分享和探索的地方2、Laravel China 中国最大的 Laravel 和 PHP 开发者社区3、Composer使用方法4、Pa...

    xiangzhihong 评论0 收藏0
  • PHP基础

    摘要:分别为适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。设计模式五适配器模式适配器模式将某个对象的接生成器和协程的实现在这篇文章中,作者针对那些比较难以理解的概念,以一个更为通俗的方式去讲明白。。 PHP 源码注解 PHP 的详细源码注解 PHP 字符串操作整理 一些有关字符串的常用操作。 Redis 常见七种使用场景 (PHP 实战) 这篇文章主要介绍利用 R...

    HtmlCssJs 评论0 收藏0
  • 前端基础进阶():详解面向对象、构造函数、原型原型

    摘要:我们通过一个简单的例子与图示,来了解构造函数,实例与原型三者之间的关系。而原型对象的指向构造函数。于是根据构造函数与原型的特性,我们就可以将在构造函数中,通过声明的属性与方法称为私有变量与方法,它们被当前被某一个实例对象所独有。 showImg(https://segmentfault.com/img/remote/1460000008593382); 如果要我总结一下学习前端以来我遇...

    Tony_Zby 评论0 收藏0

发表评论

0条评论

warnerwu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<