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

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

运行平台: Windows

php版本: php7.0

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


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

 $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的变量容器,那么说完潜复制,深复制就是会开辟新的内存空间。

 $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为新的对象开辟了新的内存空间,一般原型模式会配合工厂模式来进行;

 $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号";

你可能感兴趣的:(设计模式(六):原型模式)