原型模式通常用于大对象的创建。因为每次 new 一个对象会造成很大开销,原型模式仅需内存拷贝即可。

比较简单,直接上🌰:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
interface Book
{
public function setTitle(string $title);

public function getTitle(): string;
}

class eBook implements Book
{

protected string $title;

public function setTitle(string $title)
{
$this->title = $title;
}

public function getTitle(): string
{
return $this->title;
}
}


$book1 = new eBook();
$book1->setTitle('1 号电子书');
echo $book1->getTitle(), PHP_EOL;

$book2 = new eBook();
$book2->setTitle('2 号电子书');
echo $book2->getTitle(), PHP_EOL;

常规情况下,我们会用 new 创建两个对象,然后分别设置各自的书名。现在用原型模式改造一下:

1
2
3
4
5
6
7
$prototype = new eBook();

foreach(range(1, 10) as $index){
$book = clone $prototype;
$book->setTitle($index. ' 号电子书');
echo $book->getTitle(), PHP_EOL;
}

类保持不变,只在创建时该用 clone 即可。