设计模式(六):原型模式

转载请注明作者和出处//www.greatytc.com/p/5372bb8eab80

运行平台: Windows

php版本: php7.0

作者简介: 一个本该成为游戏职业选手却被编程耽误的程序员


原型模式,用来生产对象的。我们在生产过程中,往往要创建很多对象,但是有些对象new起来占用的内存很多,而且往往都是重复性的工作,这样我们可以使用clone来创建新的对象,就好像我们玩游戏,进入一个地图很多东西都是重复的,或者来说就是有一些细微的差别,那么这时候我们在创建新的对象就很耗费内存,可以clone一个对象来解决;

<?php
interface Person{
    public function __clone();
}

class Man implements Person{
    public $man;
    public $age;
    public $weight;
    public function __construct(array $object)
    {
        foreach($object as $key => $val){
            $this->$key = $val;
        }
    }

    public function __clone(){
    }
}

class man1{
    public  $manAge = 20;
}
$array = ['weight'=>100,'age'=>18,'man'=>new man1()];
$man = new Man($array);
//复制已经创建好的类
$manTwo = clone $man;
$manTwo->man->manAge=19;
var_dump($man);
var_dump($manTwo);

输出结果:

object(Man)#2 (3) {
["man"]=>
object(man1)#1 (1) {
["manAge"]=>
int(19)
}
["age"]=>
int(18)
["weight"]=>
int(100)
}
object(Man)#3 (3) {
["man"]=>
object(man1)#1 (1) {
["manAge"]=>
int(19)
}
["age"]=>
int(18)
["weight"]=>
int(100)
}

我们看到,改变了第二个的manAge的值,第一个也跟着改变了,这里就是我们已经完成了一个最简单的原型模式,但是只是一个浅复制,什么是浅复制,就是说针对这个新的变量,php没有针对他开辟新的内存空间(但是针对对象内部的普通成员属性,php还是值传递只是针对内在的对象是引用传递),在具体的话推荐大家去看看php底层里一个叫zval的变量容器,那么说完潜复制,深复制就是会开辟新的内存空间。

<?php
interface Person{
    public function __clone();
}

class Man implements Person{
    public $man;
    public $age;
    public $weight;
    public function __construct(array $object)
    {
        foreach($object as $key => $val){
            $this->$key = $val;
        }
    }

    public function __clone(){
        $this->man = clone $this->man;
    }
}

class man1{
    public  $manAge = 20;
}
$array = ['weight'=>100,'age'=>18,'man'=>new man1()];
$man = new Man($array);
//复制已经创建好的类
$manTwo = clone $man;
$manTwo->man->manAge=19;
var_dump($man);
var_dump($manTwo);

输出结果:

object(Man)#2 (3) {
["man"]=>
object(man1)#1 (1) {
["manAge"]=>
int(20)
}
["age"]=>
int(18)
["weight"]=>
int(100)
}
object(Man)#3 (3) {
["man"]=>
object(man1)#4 (1) {
["manAge"]=>
int(19)
}
["age"]=>
int(18)
["weight"]=>
int(100)
}
我们看到,改变了第二个的manAge的值,第一个没有跟着改变,这里就是深复制,php为新的对象开辟了新的内存空间,一般原型模式会配合工厂模式来进行;

<?php
interface Person{
    public function __clone();
}

class Man implements Person{
    public $man;
    public $age;
    public $weight;
    public function __construct(array $object)
    {
        foreach($object as $key => $val){
            $this->$key = $val;
        }
    }

    public function __clone(){
        $this->man = clone $this->man;
    }
}

class man1{
    public  $manAge = 20;
}

class CloneTool{
    static function tool($object,$i){
        echo "工厂克隆了".get_class($object).$i.'号';
        return clone $object;
    }
}

$array = ['weight'=>100,'age'=>18,'man'=>new man1()];
$man = new Man($array);
//复制已经创建好的类
$manTwo = CloneTool::tool($man,1);
$manTwo = CloneTool::tool($man,2);
输出结果:

"工厂克隆了Man1号";
"工厂克隆了Man2号";

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。