PHP設計模式系列(五) 原型模式

2021-07-31 08:48:44 字數 3743 閱讀 6591

原型物件,用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

原型模式就是clone就是記憶體拷貝,比new的好處是建立物件快速,適合大物件建立。

原型模式與工廠模式作用類似,都是用來建立物件

與工廠模式的實現不同,原型模式是先建立好乙個原型物件,然後通過clone原型物件來建立新的物件,這樣就免去了類建立時重複的初始化操作

原型模式適用於大物件的建立,建立乙個大物件需要很大的開銷,如果每次new就會消耗很大,原型模式僅需記憶體拷貝即可

被拷貝物件的所有變數都含有與原物件相同的值,而且對其他物件的引用仍然是指向原來的物件。

即淺拷貝只負責當前物件例項,對引用的物件不做拷貝。

被拷貝物件的所有的變數都含有與原來物件相同的值,除了那些引用其他物件的變數。那些引用其他物件的變數將指向乙個被拷貝的新物件,而不再是原有那些被引用物件。

即深拷貝把要拷貝的物件所引用的物件也都拷貝了一次,而這種對被引用到的物件拷貝叫做間接拷貝。

深拷貝要深入到多少層,是乙個不確定的問題。

在決定以深拷貝的方式拷貝乙個物件的時候,必須決定對間接拷貝的物件是採取淺拷貝還是深拷貝還是繼續採用深拷貝。

因此,在採取深拷貝時,需要決定多深才算深。此外,在深拷貝的過程中,很可能會出現迴圈引用的問題。

直接拷貝,拷貝了源物件的引用位址等,所以原來內容變化,新內容變化。

<?php 

//原型類

abstract

class

prototype

public

function

__get

($name)

public

function

__set

($name, $value)

public

abstract

function

clone

();}

//具體原型類

class

concreteprototype

extends

prototype

}//測試淺拷貝

class

deepcopydemo

$demo=new deepcopydemo();

$demo->array=array(1,2);

$obj1=new concreteprototype($demo);

$obj2=$obj1->clone();

var_dump($obj1);

var_dump($obj2);

$demo->array=array(3,4);

var_dump($obj1);

var_dump($obj2);

object(concreteprototype)[2]

public

'id' =>

object(deepcopydemo)[1]

public

'array' =>

array (size=2)

0 => int 1

1 => int 2

object(concreteprototype)[3]

public

'id' =>

object(deepcopydemo)[1]

public

'array' =>

array (size=2)

0 => int 1

1 => int 2

object(concreteprototype)[2]

public

'id' =>

object(deepcopydemo)[1]

public

'array' =>

array (size=2)

0 => int 3

1 => int 4

object(concreteprototype)[3]

public

'id' =>

object(deepcopydemo)[1]

public

'array' =>

array (size=2)

0 => int 3

1 => int 4

深拷貝通過序列化和反序列化完成拷貝,新拷貝的內容完全複製原來的內容。原來的內容變化,新內容不變。

<?php 

//原型類

abstract

class

prototype

public

function

__get

($name)

public

function

__set

($name, $value)

public

abstract

function

clone

();}

//具體原型類

class

concreteprototype

extends

prototype

}//測試深拷貝

class

deepcopydemo

$demo=new deepcopydemo();

$demo->array=array(1,2);

$obj1=new concreteprototype($demo);

$obj2=$obj1->clone();

var_dump($obj1);

var_dump($obj2);

$demo->array=array(3,4);

var_dump($obj1);

var_dump($obj2);

object(concreteprototype)[2]

public

'id' =>

object(deepcopydemo)[1]

public

'array' =>

array (size=2)

0 => int 1

1 => int 2

object(concreteprototype)[3]

public

'id' =>

object(deepcopydemo)[4]

public

'array' =>

array (size=2)

0 => int 1

1 => int 2

object(concreteprototype)[2]

public

'id' =>

object(deepcopydemo)[1]

public

'array' =>

array (size=2)

0 => int 3

1 => int 4

object(concreteprototype)[3]

public

'id' =>

object(deepcopydemo)[4]

public

'array' =>

array (size=2)

0 => int 1

1 => int 2

設計模式五 原型模式

建立型模式最後一種 原型模式 一般用於框架 或者稱為轉殖模式 使用場景 當物件建立比較繁瑣 耗時 或者有訪問許可權的時候 可以使用原型模式 以某個物件為原型 複製出新的物件 不同於new 實現 實現cloneable 介面和重寫clone方法 記憶體賦值 public class sheep imp...

設計模式(五) 原型模式

用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。通俗來說,原型模式就是從乙個物件,通過複製的手段去建立另外乙個物件,而且不需要知道任何建立的細節。思考 這麼做有什麼好處?角色說明 抽象原型類。宣告乙個轉殖自身的介面 抽象方法 具體原型類。實現乙個轉殖自身的方法 讓乙個原型轉殖自身從而...

設計模式學習 五 原型模式

用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。prototype原型模式是一種建立型設計模式,prototype模式允許乙個物件再建立另外乙個可定製的物件,根本無需知道任何如何建立的細節,工作原理是 通過將乙個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型物件拷...