美文网首页
php设计模式之原型模式

php设计模式之原型模式

作者: 小山人 | 来源:发表于2018-06-22 15:44 被阅读0次

    原型模式

    利用克隆来生成一个大对象,减少创建时的初始化等操作占用开销.
    例如我们有一个产品,名字和尺寸都是相同的,但是有不同的颜色

    目录结构

    |prototype  #项目根目录
    |--Think  #核心类库
    |----color.php  #颜色类
    |----deepCopy.php  #深拷贝
    |----Loder.php  #自动加载类
    |----shallowCopy.php  #浅拷贝
    |--index.php #单一的入口文件
    

    代码实践

    颜色类 Think/color.php

    <?php
    /**
     * 颜色类
     */
    namespace Think;
    
    class color{
        public $colors;
    }
    

    浅拷贝 Think/shallowCopy.php

    <?php
    /**
     * 浅拷贝
     */
    namespace Think;
    
    
    class shallowCopy{
        public $name;
        public $size;
        public $color;
    
        public function setAttr(array $attrs) {
            foreach ($attrs as $key=>$val){
                $this->$key = $val;
            }
        }
    }
    

    自动加载类 Think/Loder.php

    <?php
    namespace Think;
    
    class Loder{
        static function autoload($class){
            require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
        }
    }
    

    入口文件 index.php

    <?php
    define('BASEDIR',__DIR__);
    include BASEDIR . '/Think/Loder.php';
    spl_autoload_register('\\Think\\Loder::autoload');
    
    //实例化颜色类
    $color = new \Think\color();
    //设置颜色
    $color->colors = ['red','blue'];
    //设置参数
    $attr = ['name'=>'wong','size'=>12,'color'=>$color];
    //实例化浅拷贝类
    $shallowCopy = new \Think\shallowCopy();
    //赋值参数给属性
    $shallowCopy->setAttr($attr);
    //克隆类
    $newShallowCopy = clone $shallowCopy;
    var_dump($shallowCopy);
    var_dump($newShallowCopy);
    //修改新类的颜色
    $newShallowCopy->color->colors = ['yellow','white'];
    var_dump($shallowCopy);
    var_dump($newShallowCopy);
    

    输出

    object(Think\shallowCopy)#2 (3) {
      ["name"]=>
      string(4) "wong"
      ["size"]=>
      int(12)
      ["color"]=>
      object(Think\color)#1 (1) {
        ["colors"]=>
        array(2) {
          [0]=>
          string(3) "red"
          [1]=>
          string(4) "blue"
        }
      }
    }
    object(Think\shallowCopy)#3 (3) {
      ["name"]=>
      string(4) "wong"
      ["size"]=>
      int(12)
      ["color"]=>
      object(Think\color)#1 (1) {
        ["colors"]=>
        array(2) {
          [0]=>
          string(3) "red"
          [1]=>
          string(4) "blue"
        }
      }
    }
    object(Think\shallowCopy)#2 (3) {
      ["name"]=>
      string(4) "wong"
      ["size"]=>
      int(12)
      ["color"]=>
      object(Think\color)#1 (1) {
        ["colors"]=>
        array(2) {
          [0]=>
          string(6) "yellow"
          [1]=>
          string(5) "white"
        }
      }
    }
    object(Think\shallowCopy)#3 (3) {
      ["name"]=>
      string(4) "wong"
      ["size"]=>
      int(12)
      ["color"]=>
      object(Think\color)#1 (1) {
        ["colors"]=>
        array(2) {
          [0]=>
          string(6) "yellow"
          [1]=>
          string(5) "white"
        }
      }
    }
    
    

    这里实现的是浅拷贝的方式,只是拷贝了shallowCopy类,对于类中的color属性的颜色类,使用的还是相同的颜色类,修改了新的颜色,原先的也会被影响,我们想要完全的复制,对其中一个做出改变不会影响另一个,采用深拷贝的方式,将颜色类也clone

    深拷贝 Think/deepCopy.php

    <?php
    /**
     * 深拷贝
     */
    namespace Think;
    
    class deepCopy{
        public $name;
        public $size;
        public $color;
    
        public function setAttr(array $attrs) {
            foreach ($attrs as $key=>$val){
                $this->$key = $val;
            }
        }
    
        public function __clone() {
            $this->color = clone $this->color;
        }
    }
    

    入口文件 index.php

    <?php
    define('BASEDIR',__DIR__);
    include BASEDIR . '/Think/Loder.php';
    spl_autoload_register('\\Think\\Loder::autoload');
    
    $color = new \Think\color();
    $color->colors = ['red','blue'];
    $attr = ['name'=>'wong','size'=>12,'color'=>$color];
    
    $deepCopy = new \Think\deepCopy();
    $deepCopy->setAttr($attr);
    
    $newDeepCopy = clone $deepCopy;
    var_dump($deepCopy);
    var_dump($newDeepCopy);
    $newDeepCopy->color->colors = ['yellow','white'];
    var_dump($deepCopy);
    var_dump($newDeepCopy);
    

    输出

    object(Think\deepCopy)#2 (3) {
      ["name"]=>
      string(4) "wong"
      ["size"]=>
      int(12)
      ["color"]=>
      object(Think\color)#1 (1) {
        ["colors"]=>
        array(2) {
          [0]=>
          string(3) "red"
          [1]=>
          string(4) "blue"
        }
      }
    }
    object(Think\deepCopy)#3 (3) {
      ["name"]=>
      string(4) "wong"
      ["size"]=>
      int(12)
      ["color"]=>
      object(Think\color)#4 (1) {
        ["colors"]=>
        array(2) {
          [0]=>
          string(3) "red"
          [1]=>
          string(4) "blue"
        }
      }
    }
    object(Think\deepCopy)#2 (3) {
      ["name"]=>
      string(4) "wong"
      ["size"]=>
      int(12)
      ["color"]=>
      object(Think\color)#1 (1) {
        ["colors"]=>
        array(2) {
          [0]=>
          string(3) "red"
          [1]=>
          string(4) "blue"
        }
      }
    }
    object(Think\deepCopy)#3 (3) {
      ["name"]=>
      string(4) "wong"
      ["size"]=>
      int(12)
      ["color"]=>
      object(Think\color)#4 (1) {
        ["colors"]=>
        array(2) {
          [0]=>
          string(6) "yellow"
          [1]=>
          string(5) "white"
        }
      }
    }
    

    上一篇 php设计模式之建造者模式
    下一篇 php设计模式之代理模式

    相关文章

      网友评论

          本文标题:php设计模式之原型模式

          本文链接:https://www.haomeiwen.com/subject/dmikyftx.html