• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

php 原型模式

武飞扬头像
bug改一年
帮助1

一,原型模式,就是先创建好一个原型对象,然后通过拷贝原型对象来生成新的对象。适用于大对象的创建,因为每次new一个大对象会有很大的开销,原型模式仅需内存拷贝即可。

原型模式中的主要角色:

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

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

 二,浅拷贝、深拷贝

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

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

 三,例子

  1.  
     
  2.  
    //抽象原型
  3.  
    interface Prototype
  4.  
    {
  5.  
    public function clone();
  6.  
     
  7.  
    public function deepClone();
  8.  
     
  9.  
    }
  10.  
     
  11.  
    //具体原型
  12.  
    class Concrete implements Prototype
  13.  
    {
  14.  
    private $name;
  15.  
     
  16.  
    //浅拷贝
  17.  
    public function clone()
  18.  
    {
  19.  
    return clone $this;
  20.  
    }
  21.  
    //深拷贝
  22.  
    public function deepClone()
  23.  
    {
  24.  
    return unserialize(serialize($this));
  25.  
    }
  26.  
     
  27.  
    public function set($name)
  28.  
    {
  29.  
    $this->name = $name;
  30.  
    }
  31.  
     
  32.  
    public function get()
  33.  
    {
  34.  
    if (is_object($this->name)){
  35.  
    echo $this->name->name.PHP_EOL;
  36.  
    }else{
  37.  
    echo $this->name.PHP_EOL;
  38.  
    }
  39.  
     
  40.  
    }
  41.  
    }
  42.  
    class Name{
  43.  
    public $name='张三';
  44.  
    }
  45.  
     
  46.  
     
  47.  
    //当被拷贝的对象有对象引用的时候
  48.  
    $obj = new Concrete();
  49.  
    $objName=new Name();
  50.  
    $obj->set($objName);
  51.  
    $objClone = $obj->clone();
  52.  
    $objDeepClone = $obj->deepClone();
  53.  
     
  54.  
    $obj->get();
  55.  
    $objClone->get();
  56.  
    $objDeepClone->get();
  57.  
    echo '---------------'.PHP_EOL;
  58.  
     
  59.  
    $objName->name='李四';
  60.  
    $obj->get();
  61.  
    $objClone->get();
  62.  
    $objDeepClone->get();
  63.  
    echo '---------------'.PHP_EOL;
  64.  
     
  65.  
    //当被拷贝的对象只有属性变量
  66.  
     
  67.  
    $obj->set('王五');
  68.  
    $objClone = $obj->clone();
  69.  
    $objDeepClone = $obj->deepClone();
  70.  
     
  71.  
    $obj->set('小琴');
  72.  
    $obj->get();
  73.  
    $objClone->get();
  74.  
    $objDeepClone->get();
  75.  
    echo '---------------'.PHP_EOL;
  76.  
     
  77.  
    /*输出
  78.  
    张三
  79.  
    张三
  80.  
    张三
  81.  
    ---------------
  82.  
    李四
  83.  
    李四
  84.  
    张三
  85.  
    ---------------
  86.  
    小琴
  87.  
    王五
  88.  
    王五
  89.  
    ---------------*/
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfbkia
系列文章
更多 icon
同类精品
更多 icon
继续加载