喜迎
春节

设计模式——原型模式


说明

将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。

示例

下面看下原型模式的代码实现

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
// 定义了一个原型
abstract class Prototype{
public $v = 'clone'.PHP_EOL;
public function __construct(){
echo 'create'.PHP_EOL;
}
abstract public function __clone();
}

class ConcretePrototype1 extends Prototype{
public function __clone(){

}
public function init($param){
$this->v = $param;
}
}

class ConcretePrototype2 extends Prototype{
//当外部使用clone关键字进行对象克隆时,直接就会进入这个魔术方法中。
//在这个魔术方法里面我们可以对属性进行处理,特别是针对引用属性进行一些独特的处理。
public function __clone(){
$this->v = 'clone 2';
}
}



// 调用
$p = new ConcretePrototype1();
$p->init('hello');
$p1 = clone $p; // ConcretePrototype1的__construct不会被执行
echo $p->v.'=='.$p1->v; // output: create hello==hello


$p = new ConcretePrototype2();
$p2 = clone $p;
echo $p->v.'=='.$p2->v; // output: create clone ==clone 2

// 浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
// 定义了一个原型
abstract class Prototype{
public $v = 'clone'.PHP_EOL;
public function __construct(){
echo 'create'.PHP_EOL;
}
abstract public function __clone();
}

class ConcretePrototype1 extends Prototype{
public function __clone(){

}
public function init($param){
$this->v = $param;
}
}

class ConcretePrototype2 extends Prototype{
//当外部使用clone关键字进行对象克隆时,直接就会进入这个魔术方法中。
//在这个魔术方法里面我们可以对属性进行处理,特别是针对引用属性进行一些独特的处理。
public function __clone(){
$this->v = 'clone 2';
}
}



// 调用
$p = new ConcretePrototype1();
$p->init('hello');
$p1 = clone $p; // ConcretePrototype1的__construct不会被执行
echo $p->v.'=='.$p1->v; // output: create hello==hello


$p = new ConcretePrototype2();
$p2 = clone $p;
echo $p->v.'=='.$p2->v; // output: create clone ==clone 2

// 浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
// 深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。

总结

特点:减少创建对象时的开销


文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
评 论
 上一篇
设计模式——单例模式
设计模式——单例模式
说明单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。单例模式适用于经常被访问的对象,或是创建和销毁需要调用大量资源和时间的对象,使用单例模式可以避免频繁创建和销毁对
2022-05-19
下一篇 
设计模式——命令模式
设计模式——命令模式
说明示例下面看下命令模式的代码实现 1234567891011121314151617181920212223242526272829303132333435363738394041// 创建接口Commandinterface Comma
2022-05-19
  目录