课程名称:大话PHP设计模式
课程章节: 10-1PHP原型模式
课程链接
主讲老师:Rango
课程内容
给出了原型模式的定义,然后通过代码演示让我们更加深入了解到原型模式的实现原理,当大对象的创建时可以使用到这种模式。
作者:万万的小刀
链接:https://www.imooc.com/article/329558
来源:慕课网
课程收获
定义
原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。所有的原型类都必须有一个通用的接口, 使得即使在对象所属的具体类未知的情况下也能复制对象。
原型对象可以生成自身的完整副本, 因为相同类的对象可以相互访问对方的私有成员变量。
理解
1、与工厂模式作用类似,都是用来创建对象
2、与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。
优势
原型模式适用于大对象的创建。创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅通需内存拷贝即可
代码实现
class Canvas
{
public $data;
function init($width = 20, $height = 10)
{
$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 $line) {
foreach ($line as $char) {
echo $char;
}
echo "<br />\n";
}
}
function rect($a1, $a2, $b1, $b2)
{
foreach ($this->data as $k1 => $line) {
if ($k1 < $a1 || $k1 > $a2)
continue;
foreach ($line as $k2 => $char) {
if ($k2 < $b1 || $k2 > $b2)
continue;
$this->data[$k1][$k2] = ' ';
}
}
}
}
$prototype = new Canvas;
$prototype->init();
$canvas1 = clone $prototype;
$canvas1->rect(3, 6, 4, 12);
$canvas1->draw();
echo "<hr />";
$canvas2 = clone $prototype;
$canvas2->rect(1, 3, 2, 6);
$canvas2->draw();