继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【九月打卡】第9天 设计模式之原型模式

潮流宣乐生
关注TA
已关注
手记 55
粉丝 0
获赞 0

课程名称:大话PHP设计模式

课程章节:原型模式

课程讲师:Rango

课程内容:

为什么要使用原型模式?

  • 如果一个类在初始化时,资源开销比较大,则适合使用原型模式

原型模式和工厂模式

  • 原型模式与工厂模式类似,都是用来创建对象的
  • 与工程模式不同的是,原型模式是先创建好一个原型对象,然后通过clone原型对象的方式来创建新的对象,这样就免去了新的对象的初始化操作。这样仅需要内存拷贝则实现了新对象的创建

其它

  • 原型模式非常简单,但是在合适的场景下能极大的提高效率,适合于其它模式一起使用

代码

该实例中的Imooc\Loader.php文件为框架加载文件,不是策略模式中的文件
该实例模拟一个画布画画的操作,该实例的类在初始化时会生成画布,多次生成就比较消耗资源,所以使用使用原型模式

  • 代码目录结构
    代码目录结构

  • Imooc\Canvas.php

<?php

namespace Imooc;

class Canvas
{
  public $data;
  public function init($width = 10, $height = 20) {
    $data = [];
    for ($i = 0; $i<$width; $i++) {
      for ($j = 0; $j<$height; $j++) {
        $data[$i][$j] = '*';
      }
    }

    $this->data = $data;
  }

  public function draw() {
    foreach ($this->data as $i) {
      foreach ($i as $j) {
        echo $j;
      }
      echo PHP_EOL;
    }

  }

  public 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;
        $symbol = '&nbsp;';
        if(php_sapi_name() == 'cli') $symbol = ' ';
        $this->data[$k1][$k2] = $symbol;
      }
    }
  }
}
  • Imooc\Loader.php
<?php

namespace Imooc;

class Loader
{
  static public function autoload($class) {
    require BASEDIR . '/' . str_replace('\\', '/', $class) . '.php';
  }
}
  • index.php
<?php
define('BASEDIR', __DIR__);
include BASEDIR . '/Imooc/Loader.php';

spl_autoload_register('\\Imooc\\Loader::autoload');

// 这里创建了画布类的原型并初始化了
$prototype = new \Imooc\Canvas;
$prototype->init();

// 当需要使用画布时,则通过clone来克隆画布,而不是直接new
$obj1 = clone $prototype;
$obj1->rect(2, 5, 3, 6);
$obj1->draw();
echo '---------------------------------' . PHP_EOL;

// 每次克隆都是一个全新的画布
$obj2 = clone $prototype;
$obj2->rect(2, 6, 3, 5);
$obj2->draw();
echo '---------------------------------' . PHP_EOL;

/* 输出:
********************
********************
***    *************
***    *************
***    *************
***    *************
********************
********************
********************
********************
---------------------------------
********************
********************
***   **************
***   **************
***   **************
***   **************
***   **************
********************
********************
********************
---------------------------------
*/

课程收获

原型模式简单到可以使用一句话来概括,并且也可以使用一句代码来实现其核心思想,但尽管如此简单的内容也属于设计模式的一种;我认为这在于其在代码优化中所具有的作用是非常大的,需要用在合适的地方。

图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP