PHP设计模式之原型模式

原型模式 即 对象克隆以避免创建对象时的消耗
1: 与工厂模式类似,都是用来创建对象。 
2:与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过 clone 原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。 
3:原型模式适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需要内存拷贝即可。

Canvas.php //文件

<?php

class Canvas{

    private $data;

    function init($width = 20, $height = 10)
    {
        $data = array();
        for($i = 0; $i < $height; $i++)
        {
            for($j = 0; $j < $width; $j++)
            {
                $data[$i][$j] = '*';
            }
        }
        $this->data = $data;
    }

    function rect($x1, $y1, $x2, $y2)
    {
        foreach($this->data as $k1 => $line)
        {
            if ($x1 > $k1 or $x2 < $k1) continue;
           foreach($line as $k2 => $char)
            {
              if ($y1>$k2 or $y2<$k2) continue;
                $this->data[$k1][$k2] = '#';
            }
        }
    }

    function draw(){
        foreach ($this->data as $line){
            foreach ($line as $char){
                echo $char;
            }
            echo "<br>;";
        }
    }
}
Index.php  // 入口文件

<?php

$c = new Canvas();
$c->init();

// $canvas1 = new Canvas();
// $canvas1->init();

//通过克隆 $c,可以省去 init() 方法
$canvas1 = clone $c; 

//去产生一个数组。当项目中需要产生很多的这样的对象时,就会new很多的对象,那样是非常消耗性能的。
$canvas1->rect(2, 2, 8, 8);
$canvas1->draw();

echo "-----------------------------------------<br>";

// $canvas2 = new Canvas();
// $canvas2->init();

$canvas2 = clone $c;
$canvas2->rect(1, 4, 8, 8);
$canvas2->draw();

 

posted on 2020-06-30 11:12  小识堂  阅读(123)  评论(0编辑  收藏  举报

导航