原型模式

原型模式定义

原型模式是一种创建者模式,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。

代码实现

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
/**
* Created by PhpStorm.
* User: Livfer
* Desc:
* Date: 2019/10/21
* Time: 10:55
*/

interface Prototype
{
public function copy();

public function deepCopy();
}

class ConcretePrototype implements Prototype
{

private $name;

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

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

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

/**
* 浅拷贝
* 被拷贝的对象的所有变量都含有与原对象相同的值,且对其他对象的引用仍然只想原对象.即浅拷贝只拷贝当前对象的实例,对引用不拷贝
* @return ConcretePrototype
*/
public function copy()
{
// TODO: Implement copy() method.
return clone $this;
}

/**
* 深度拷贝
* 被拷贝的对象的其他所有变量都含有原对象的值,除了那些引用其他对象的变量.深拷贝将对其他引用的对象也拷贝为了一个新的对象,对其他对象引用的变量指向了这个新的拷贝对象
* @return mixed
*/
public function deepCopy()
{
// TODO: Implement deepCopy() method.
$serializeObj = serialize($this);
$cloneObj = unserialize($serializeObj);
return $cloneObj;
}
}

class Demo
{
public $array;
}

class ClientPrototype
{
public static function main()
{
$demo = new Demo();
$demo->array = [1,2];
$object1 = new ConcretePrototype($demo);
$object2 = $object1->copy();//浅拷贝

echo "原对象: ";
var_dump($object1->getName());
echo "<br />";
echo "浅拷贝对象: ";
var_dump($object2->getName());
echo "<br />";

$object3 = $object1->deepCopy();
$demo->array = [3,4];
echo "原对象: ";
var_dump($object1->getName());
echo "<br />";
echo "深度拷贝对象: ";
var_dump($object3->getName());
}
}

ClientPrototype::main();

参考

设计模式详解及PHP实现