原型设计模式

什么是原型设计模式

简单的说,就是先 new 一个对象, 然后后面不用再次使用 new 来创建新的对象,而是直接通过 clone 来复制对象。
类型: 创建性设计模式

为什么要用

解决某些结构非常复杂的对象的创建问题。

何时使用

就像是袁隆平院士培养水稻,培养的过程中,没必要每次都从原始的水稻开始培养,他可以先得到抗倒伏的水稻,然后从抗倒伏水稻的基础上,得到抗病虫害的水稻。

如何使用

因为 php 中有 clone 关键字,所以一切都变得简单了。
__clone() 魔术方法会在 clone 关键字触发的时候生效。
warning : 使用 clone 关键字克隆对象的时候不会触发构造函数。
参与者:
原型类
客户端

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
32
33
34
35
36
37
38
39
40
<?php

abstract class CloneMe
{
public $name;
public $picture;
abstract function __clone();
}

/**
* summary
*/
class Person extends CloneMe
{
/**
* summary
*/
public function __construct()
{
$this->picture = 'clone.png';
$this->name = 'original';
}

public function display()
{
echo $this->picture.PHP_EOL;
echo $this->name.PHP_EOL;
}

function __clone() {}
}

$worker = new Person();

$worker->display();

$slacker = clone $worker;
$slacker->name = 'Cloned';

$slacker->display();

OOP 封装形式的原型模式

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php

abstract class CloneMe
{
protected $name;
protected $picture;
abstract function getName();
abstract function getPicture();
abstract function setName($name);
abstract function setPicture($picture);

abstract function __clone();
}

/**
* summary
*/
class Person extends CloneMe
{
/**
* summary
*/
public function __construct()
{
$this->picture = 'original.png';
$this->name = 'original';
}

public function display()
{
echo $this->picture . PHP_EOL;
echo $this->name . PHP_EOL;
}

public function setName($name)
{
$this->name = $name;
}

public function setPicture($picture)
{
$this->picture = $picture;
}

public function getName()
{
return $this->name;
}

public function getPicture()
{
return $this->picture;
}

function __clone() {}
}

$worker = new Person();

$worker->display();

$slacker = clone $worker;
$slacker->setName('Cloned');
$slacker->setPicture('clone.png');

$slacker->display();

上面代码增加了封装特性,让类的几个成员变量通过函数进行赋值。

总结

原型设计模式可以省去初始化操作的复杂工作。而且 clone 的时候不需要调用构造函数,会稍微比再次 new 一个对象要省一些系统资源。