原文地址:PHP设计模式(九):原型设计模式php
在PHP设计模式(八):工厂模式中咱们介绍了建立设计模式(Creation patterns)中的工厂模式,下面咱们将介绍另外一种原型设计模式(Prototype Method)。
在PHP中,原型设计模式依靠cloning复制对象来实现。经过cloning构造的对象,将大量节省新对象的构造时间。设计模式
简单来讲,当你但愿根据已有的对象来建立新对象时。
为何会有这种需求?想象一下,你在作细胞分裂的项目,每个细胞都是一个对象,如今你有一个细胞类,每个新的细胞都是由这个类生成的,不一样的细胞只是内部的状态参数不一样。
当分裂到第N代的时候,已经和初代大不同了,你是愿意使用第N代的副本修改一下呢?仍是愿意从初代慢慢推演?函数
PHP提供了内建的__clone()函数以及clone关键字,来实现对象的复制。下面给出一个例子:this
<?php abstract class Cell { public $id; public $dna; abstract function __clone(); } class WhaleCell extends Cell { public function __construct() { $this->id = 1; $this->dna = "ATCG"; } public function displayDNA() { echo $this->dna . "\n"; } 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。code
使用clone建立新对象时,并不会触发类的构造函数。这也是在使用原型设计模式中须要注意的一点。clone的底层实现并非调用类的构造函数来建立一个类,而是直接拷贝一个类的地址空间,生成另外一个类。这种直接拷贝也带来了高效。
事实上,使用构造函数并不必定是一个好的设计,因为构造函数内的逻辑没法被外部控制,当须要修改一个类构造时的逻辑时,除了修改类的构造函数实现之外,别无他法,这破坏了类的封装。对象
原型设计模式带来了另外一种建立对象的思路,合理的使用cloning构造对象,将提升程序建立新对象时的效率。get