• 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 1

    PHP原型模式

    Posted by 撒得一地 on 2016年2月23日 in PHP笔记
    国外稳定加速器推荐    Express | Vypr

    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

    发表评论

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

    4 + 7 = ?

    网站地图|广东快乐10分开奖直播

    Copyright © 2015-2019 广东快乐10分开奖直播 All rights reserved.
    闽ICP备15015576号-1,版权所有?psz.

  • 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 七乐彩走势图带连线 竞彩比分直播 北京赛车刷返点技巧 体彩超级大乐透开奖结果 江苏时时彩预测软件破解版 中国福彩快三开奖结果 体育顶呱刮新票有哪些 2元彩票最多中多少钱 北京赛车追号计算器 上海时时乐出号走 真钱扎金花 竞彩篮球胜分差计算器 金百博五分彩走势图 博彩行业 赛车北京pk10历史记录 河北彩票销售额