• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

php设计模式四 ---- 原型模式

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1.简介

  用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

  意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

  主要解决:在运行期建立和删除原型。

 

// 1 抽象原型角色

interface Prototype{

    public function shallowCopy();

    public function deepCopy();
}

// 2. 具体原型角色

class ConcretePrototye implements Prototype{

    private $_name;

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

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

    public function getName(){
        return $this->_name;
    }

    // 浅拷贝
    public function shallowCopy(){
        return clone $this;
    }

    // 深拷贝
    public function deepCopy(){
        $serialize_obj = serialize( $this );
        $clone_obj        = unserialize( $serialize_obj );

        return $clone_obj;
    }

}

// 3 使用
class Demo{
    private $str;

    public function setStr( $str ){
        $this->str = $str;
    }

    public function getStr(){
        return $this->str;
    }
}

class UsePrototype{

    public function shallow(){

        $demo = new Demo();
        $demo->setStr('vic');

        $shallow_first  = new ConcretePrototye( $demo );
        $shallow_second = $shallow_first->shallowCopy();

        var_dump($shallow_first->getName());
        echo '<br/>';
        var_dump($shallow_second->getName());
        echo '<br/>';
        $demo->setStr( 'myvic' );


        var_dump($shallow_first->getName());
        echo '<br/>';
        var_dump($shallow_second->getName());
        echo '<br/>';
    }

    public function deep(){
        $demo = new Demo();
        $demo->setStr('vic');

        $shallow_first  = new ConcretePrototye( $demo );
        $shallow_second = $shallow_first->deepCopy();

        var_dump($shallow_first->getName());
        echo '<br/>';
        var_dump($shallow_second->getName());
        echo '<br/>';

        $demo->setStr('myvic');
        var_dump($shallow_first->getName());
        echo '<br/>';
        var_dump($shallow_second->getName());
        echo '<br/>';
    }
}

$up = new UsePrototype();
$up->shallow();
echo '<hr/>';
$up->deep();

运行结果:浅拷贝后,克隆对象的引用没有拷贝,改变后都会有变化;深拷贝,会把克隆对象的引用,也拷贝一份;

2. 深拷贝和浅拷贝

代码中提到了深拷贝和浅拷贝,那么我们先来分析一下这两者的区别

 

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

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

 在决定以深拷贝的方式拷贝一个对象的时候,必须决定对间接拷贝的对象时采取浅拷贝还是深拷贝还是继续采用深拷贝。

序列化深拷贝:利用序列化来做深拷贝,把对象写到流里的过程是序列化的过程,这一过程称为“冷冻”或“腌咸菜”,反序列化对象的过程叫做“解冻”或“回鲜”。

 

参考资料:https://www.cnblogs.com/ddddemo/p/5623213.html

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
php命名空间发布时间:2022-07-10
下一篇:
centOs下的php+mysql+apache+ftp配置发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap