课程名称:大话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 = ' ';
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;
/* 输出:
********************
********************
*** *************
*** *************
*** *************
*** *************
********************
********************
********************
********************
---------------------------------
********************
********************
*** **************
*** **************
*** **************
*** **************
*** **************
********************
********************
********************
---------------------------------
*/
课程收获
原型模式简单到可以使用一句话来概括,并且也可以使用一句代码来实现其核心思想,但尽管如此简单的内容也属于设计模式的一种;我认为这在于其在代码优化中所具有的作用是非常大的,需要用在合适的地方。