php设计模式(8)齐天大圣的毫毛-原型模式

2017-03-12 15:57:26 admin ...

前言

原型模式比较好理解,也是常用的创建对象的一种模式。我们今天来聊一聊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;

注意深复制和浅复

相似文章