最新消息:

设计模式之原型模式

未分类 293浏览 0评论

基本概念:

    与工厂模式作用类似,都是用来创建对象。但与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过 clone 原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。

应用场景:

    原型模式适用于大对象的创建。创建一个大对象需要很大的系统开销,如果每次使用new实例创建,就会消耗很大,原型模式仅需内存拷贝即可。

代码示例:

/**
 * 新建canvas类
 * Class Canvas
 * @package Wecot
 */
class Canvas
{
    public $data;

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

    function draw()
    {
        foreach ($this->data as $heightArr) {
            foreach ($heightArr as $widthChar) {
                echo $widthChar;
            }
            echo PHP_EOL;
        }
    }

    function rect($a1, $a2, $b1, $b2)
    {
        foreach ($this->data as $k1 => $line) {
            if ($k1 < $a1 or $k1 > $a2) continue;
            foreach ($line as $k2 => $widthChar) {
                if ($k2 < $b1 or $k2 > $b2) continue;
                $this->data[$k1][$k2] = ' ';
            }
        }
    }
}

传统调用方式:

//建立原型对象
$canvas1 = new \Wecot\Canvas();
$canvas1->init();
$canvas1->rect(3, 6,4,20);
$canvas1->draw();
echo '======================================'.PHP_EOL;
$canvas2 = new \Wecot\Canvas();
$canvas2->rect(3, 6,4,25);
$canvas2->draw();

以上程序复杂度较高,因此带来的系统开销较大。使用原型模式利用只是在内存中进行对象拷贝操作,对比之下,颇有良效。

原型模式调用:

//建立原型对象
$prototype = new \Wecot\Canvas();
$prototype->init();

$canvas1 = clone $prototype;
$canvas1->rect(3, 6,4,20);
$canvas1->draw();
echo '======================================'.PHP_EOL;
$canvas2 = clone $prototype;
$canvas2->rect(3, 6,4,25);
$canvas2->draw();

执行结果:

image.png

转载请注明:微刻 blog.wecot.cn » 设计模式之原型模式

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址