1

PHP原型模式

Posted by 撒得一地 on 2016年2月23日 in PHP笔记

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

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

原型模式通过复制已经存在的实例来返回新的实例,而不是新建实例,并且原型(被复制的实例)是可定制的;原型模式多用于创建复杂的或耗时的实例,这种情况下,复制一个已经存在的实例是程序运行更高效无疑是一种好办法。

原型模式UML图:

PHP原型模式

下面用原型模式实现一个画布实例:

class Canvas
{
    public $data;
    protected $decorators = array();

    //Decorator
    //初始化一个有'*'组成的正方形
    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 addDecorator(DrawDecorator $decorator)
    {
        $this->decorators[] = $decorator;
    }

    function beforeDraw()
    {
        foreach($this->decorators as $decorator)
        {
            $decorator->beforeDraw();
        }
    }

    function afterDraw()
    {
        $decorators = array_reverse($this->decorators);
        foreach($decorators as $decorator)
        {
           $decorator->afterDraw();
        }
    }

    function draw()
    {
        $this->beforeDraw();
        foreach($this->data as $line)
        {
            foreach($line as $char)
            {
                echo $char;
            }
            echo "<br />\n";
        }

        $this->afterDraw();
    }

    function rect($a1, $a2, $b1, $b2)
    {
        foreach($this->data as $k1 => $line)
        {
            if ($k1 < $a1 or $k1 > $a2) continue;
            foreach($line as $k2 => $char)
            {
                if ($k2 < $b1 or $k2 > $b2) continue;
                $this->data[$k1][$k2] = '&nbsp;';
            }
        }
    }
}
$canvas1 = new Canvas();
$canvas1->init();
$canvas1->rect(3,6,4,12);
$canvas1->draw();

假如现在要绘制两次图形,那么按照传统的方法就要new两次,如:

$canvas1 = new Canvas();
$canvas1->init();
$canvas1->rect(3,6,4,12);
$canvas1->draw();

echo "................................<br/>";

$canvas2 = new Canvas();
$canvas2->init();
$canvas2->rect(1,3,2,6);
$canvas2->draw();

而用原型模式就可以用clone方法,而不用new两次:

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

$canvas1 = clone $prototype 
$canvas1->rect(3,6,4,12);
$canvas1->draw();

$canvas2 = clone $prototype 
$canvas2->rect(1,3,2,6);
$canvas2->draw();

使用原型模式,只要去构建一个原型对象,让原型对象去操作一些初始化操作,参数设置等。然后直接用克隆的方法去实现不同的对象,再去操作不同的方法。这样避免了重复new生成对象,都要去初始化一些复杂的操作。

原型模式优点:

1、可以在运行时刻增加和删除产品
2、可以改变值或结构以指定新对象
3、减少子类的构造
4、用类动态配置应用

原型模式的缺点:

Prototype是的最主要的缺点就是每一个类必须包含一个克隆方法;
而且这个克隆方法需要对类的功能进行检测,这对于全新的类来说较容易,但对已有的类进行改造时将不是件容易的事情。

标签:

上一篇:

下一篇:

相关推荐

1 Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注

0 + 7 = ?

网站地图|XML地图

Copyright © 2015-2018 技术拉近你我! All rights reserved.
闽ICP备15015576号-1,版权所有©psz.