PHP 原型模式

 

原型模式:原型模式是先创建好一个原型对象,然后通过拷贝原型对象来创建新的对象。适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可。也可以用作动态加载。

 

原型模式中主要角色

抽象原型(Prototype)角色:声明一个克隆自身的接口

具体原型(Concrete Prototype)角色:实现一个克隆自身的操作

 

【原型模式PHP示例】

interface Prototype{        # 抽象原型
    public function copy();
    public function deepCopy();
}

class ConcretePrototype implements Prototype {  # 具体原型

    public $name;

    public function copy()
    {
        return clone $this;
    }


    public function deepCopy()
    {
        return unserialize(serialize($this));
    }


    public function getName(){
        if(is_object($this->name)){
            echo $this->name->temp."<br/>";
        }else{
            echo $this->name."<br/>";
        }
    }


    public function setName($name){
        $this->name = $name;
    }
}



//当被复制对象有其他对象的引用时候//

class Name{
    public $temp;
}

$obj = new ConcretePrototype();
$name = new Name();
$name->temp = 'Ming';
$obj->setName($name);
$obj1 = $obj->copy();              #浅拷贝
$obj2 = $obj->deepCopy();      #深拷贝

$obj->getName();
$obj1->getName();
$obj2->getName();

$name->temp = 'Mei';
$obj->getName();
$obj1->getName();
$obj2->getName();

//当被复制对象只有变量时候//
$obj->setName('Zheng');
$obj1 = $obj->copy();
$obj2 = $obj->deepCopy();
$obj->setName('Qu');

$obj->getName();
$obj1->getName();
$obj2->getName();


输出的结果为
Ming
Ming
Ming
Mei
Mei
Ming
Qu
Zheng
Zheng

 

下面说一下浅拷贝与深拷贝:

浅拷贝:被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。
即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。

深拷贝:被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。
即深拷贝把要拷贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。

 

posted on 2017-01-03 17:09  莫小安  阅读(241)  评论(0编辑  收藏  举报

导航