原型模式
利用克隆来生成一个大对象,减少创建时的初始化等操作占用开销.
例如我们有一个产品,名字和尺寸都是相同的,但是有不同的颜色
目录结构
|prototype #项目根目录
|--Think #核心类库
|----color.php #颜色类
|----deepCopy.php #深拷贝
|----Loder.php #自动加载类
|----shallowCopy.php #浅拷贝
|--index.php #单一的入口文件
代码实践
颜色类 Think/color.php
<?php
/**
* 颜色类
*/
namespace Think;
class color{
public $colors;
}
浅拷贝 Think/shallowCopy.php
<?php
/**
* 浅拷贝
*/
namespace Think;
class shallowCopy{
public $name;
public $size;
public $color;
public function setAttr(array $attrs) {
foreach ($attrs as $key=>$val){
$this->$key = $val;
}
}
}
自动加载类 Think/Loder.php
<?php
namespace Think;
class Loder{
static function autoload($class){
require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
}
}
入口文件 index.php
<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');
//实例化颜色类
$color = new \Think\color();
//设置颜色
$color->colors = ['red','blue'];
//设置参数
$attr = ['name'=>'wong','size'=>12,'color'=>$color];
//实例化浅拷贝类
$shallowCopy = new \Think\shallowCopy();
//赋值参数给属性
$shallowCopy->setAttr($attr);
//克隆类
$newShallowCopy = clone $shallowCopy;
var_dump($shallowCopy);
var_dump($newShallowCopy);
//修改新类的颜色
$newShallowCopy->color->colors = ['yellow','white'];
var_dump($shallowCopy);
var_dump($newShallowCopy);
输出
object(Think\shallowCopy)#2 (3) {
["name"]=>
string(4) "wong"
["size"]=>
int(12)
["color"]=>
object(Think\color)#1 (1) {
["colors"]=>
array(2) {
[0]=>
string(3) "red"
[1]=>
string(4) "blue"
}
}
}
object(Think\shallowCopy)#3 (3) {
["name"]=>
string(4) "wong"
["size"]=>
int(12)
["color"]=>
object(Think\color)#1 (1) {
["colors"]=>
array(2) {
[0]=>
string(3) "red"
[1]=>
string(4) "blue"
}
}
}
object(Think\shallowCopy)#2 (3) {
["name"]=>
string(4) "wong"
["size"]=>
int(12)
["color"]=>
object(Think\color)#1 (1) {
["colors"]=>
array(2) {
[0]=>
string(6) "yellow"
[1]=>
string(5) "white"
}
}
}
object(Think\shallowCopy)#3 (3) {
["name"]=>
string(4) "wong"
["size"]=>
int(12)
["color"]=>
object(Think\color)#1 (1) {
["colors"]=>
array(2) {
[0]=>
string(6) "yellow"
[1]=>
string(5) "white"
}
}
}
这里实现的是浅拷贝的方式,只是拷贝了shallowCopy类,对于类中的color属性的颜色类,使用的还是相同的颜色类,修改了新的颜色,原先的也会被影响,我们想要完全的复制,对其中一个做出改变不会影响另一个,采用深拷贝的方式,将颜色类也clone
深拷贝 Think/deepCopy.php
<?php
/**
* 深拷贝
*/
namespace Think;
class deepCopy{
public $name;
public $size;
public $color;
public function setAttr(array $attrs) {
foreach ($attrs as $key=>$val){
$this->$key = $val;
}
}
public function __clone() {
$this->color = clone $this->color;
}
}
入口文件 index.php
<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');
$color = new \Think\color();
$color->colors = ['red','blue'];
$attr = ['name'=>'wong','size'=>12,'color'=>$color];
$deepCopy = new \Think\deepCopy();
$deepCopy->setAttr($attr);
$newDeepCopy = clone $deepCopy;
var_dump($deepCopy);
var_dump($newDeepCopy);
$newDeepCopy->color->colors = ['yellow','white'];
var_dump($deepCopy);
var_dump($newDeepCopy);
输出
object(Think\deepCopy)#2 (3) {
["name"]=>
string(4) "wong"
["size"]=>
int(12)
["color"]=>
object(Think\color)#1 (1) {
["colors"]=>
array(2) {
[0]=>
string(3) "red"
[1]=>
string(4) "blue"
}
}
}
object(Think\deepCopy)#3 (3) {
["name"]=>
string(4) "wong"
["size"]=>
int(12)
["color"]=>
object(Think\color)#4 (1) {
["colors"]=>
array(2) {
[0]=>
string(3) "red"
[1]=>
string(4) "blue"
}
}
}
object(Think\deepCopy)#2 (3) {
["name"]=>
string(4) "wong"
["size"]=>
int(12)
["color"]=>
object(Think\color)#1 (1) {
["colors"]=>
array(2) {
[0]=>
string(3) "red"
[1]=>
string(4) "blue"
}
}
}
object(Think\deepCopy)#3 (3) {
["name"]=>
string(4) "wong"
["size"]=>
int(12)
["color"]=>
object(Think\color)#4 (1) {
["colors"]=>
array(2) {
[0]=>
string(6) "yellow"
[1]=>
string(5) "white"
}
}
}
上一篇 php设计模式之建造者模式
下一篇 php设计模式之代理模式
网友评论