前言
原型模式比较好理解,也是常用的创建对象的一种模式。我们今天来聊一聊PHP设计模式中的原型模式( Prototype Pattern)。
内容概要:
1、什么是原型模式
2、为什么要用原型模式
3、什么情况下使用原型模式
4、示例代码
一、什么是原型模式
我这里把原型模式比作是齐天大圣的毫毛,准确的理解是,齐天大圣拔一根毫毛就复制出来一个自己,这种方式我们叫做原型模式。
原型模式-齐天大圣也常用
就是说,如果PHP有一个类,创建这个类的对象,初始化阶段需要做好多的事情,那在第二次使用的时候,不去重复new,二是将原先创建好的对象克隆一份就好了。如此一来,第二次使用对象的时候速度就很快了,而且节省系统不少资源。为创建节约型社会做出了一份贡献。
原型模式的定义,我就不抄了哈,大家自行搜索。给个UML图大家体会:
原型设计模式UML图
二、为什么要使用原型模式
php代码中,二次创建对象的时候,直接clone对象比再重复new一次对象要省时省力省钱。
当然其他编程语言也是这样。
三、什么情况下使用原型模式
创建类的对象的时候,如果初始化比较复杂,那就用原型模式。
结合例子来说,齐天大圣与妖怪们作战,发现人手不够,如果再去用个石头孕育个n年,然后再去拜师学艺,然后在回来帮大圣作战,估计大圣早就壮烈了,所以,大圣采用原型模式,clone出多个自己,群殴妖怪。
四、示例代码
需要说明的是,由于对象在php中是以引用的方式调用的,所有在clone属性中有其他对象引用的时候,要注意区分浅复制和深复制。深浅复制的区别是,新对象和原型对象是否引用地址相同。
这里我来写一个深复制的原型模式,去掉clone方法就是浅复制了。
不墨迹,上代码。
<?php
/************************************************************
** @Description: php设计模式之原型模式代码示例
** @Author: haodaquan
** @Date: 2017-03-11 12:59:43
** @Last Modified by: haodaquan
** @Last Modified time: 2017-03-11 13:24:43
*************************************************************/
#悟空
class Wukong
{
public $attribute = 0;
}
#毫毛
class Hair
{
public $obj;
public function __construct($obj)
{
$this->obj = $obj;
}
#去掉这个方法是浅复制
public function __clone()
{
$this->obj = clone $this->obj;
}
}
#创建一个悟空:石头蹦出来……
$mainWuKong = new Wukong();
#毫毛变孙悟空的对象a
$wukong_a = new Hair($mainWuKong);
#clone一个能干仗的孙悟空实例b
$wukong_b = clone $wukong_a;
var_dump (spl_object_hash($wukong_a->obj) === spl_object_hash($wukong_b->obj));
#运行结果:false;
注意深复制和浅复