PHP設計模式 九 原型設計模式

2021-09-19 04:44:38 字數 1389 閱讀 9008

在php設計模式(八):工廠模式中我們介紹了建立設計模式(creation patterns)中的工廠模式,下面我們將介紹另一種原型設計模式(prototype method)。

在php中,原型設計模式依靠cloning複製物件來實現。通過cloning構造的物件,將大量節省新物件的構造時間。

簡單來說,當你希望根據已有的物件來建立新物件時。

為什麼會有這種需求?想象一下,你在做細胞**的專案,每乙個細胞都是乙個物件,現在你有乙個細胞類,每乙個新的細胞都是由這個類生成的,不同的細胞只是內部的狀態引數不同。

當**到第n代的時候,已經和初代大不一樣了,你是願意使用第n代的副本修改一下呢?還是願意從初代慢慢推演?

php提供了內建的__clone()函式以及clone關鍵字,來實現物件的複製。下面給出乙個例子:

<?php

abstract class cell

class whalecell extends cell

public function displaydna()

function __clone()

if ($this->id % 5 == 0)

}}$whalecell = new whalecell();

$whalecell->displaydna();

$whalecell2 = clone $whalecell;

$whalecell2->displaydna();

$whalecell3 = clone $whalecell2;

$whalecell3->displaydna();

$whalecell4 = clone $whalecell3;

$whalecell4->displaydna();

$whalecell5 = clone $whalecell4;

$whalecell5->displaydna();

?>

執行一下:

atcg

atcg

atcgat

atcgat

atcgatcg

程式簡單的模擬了dna的遺傳突變,每遺傳三代,dna增加at,每遺傳五代,dna增加cg。

使用clone建立新物件時,並不會觸發類的建構函式。這也是在使用原型設計模式中需要注意的一點。clone的底層實現並不是呼叫類的建構函式來建立乙個類,而是直接拷貝乙個類的位址空間,生成另乙個類。這種直接拷貝也帶來了高效。

事實上,使用建構函式並不一定是乙個好的設計,由於建構函式內的邏輯無法被外部控制,當需要修改乙個類構造時的邏輯時,除了修改類的建構函式實現以外,別無他法,這破壞了類的封裝。

原型設計模式帶來了另一種建立物件的思路,合理的使用cloning構造物件,將提高程式建立新物件時的效率。

設計模式(九)原型模式 Prototype

1.介紹 作用 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。其中有乙個詞很重要,那就是拷貝 深拷貝 可以說,拷貝是原型模式的精髓所在。2.應用場景 示例1 找工作的時候,我們需要準備簡歷。假設沒有列印裝置,因此需手寫簡歷,這些簡歷的內容都是一樣的。這樣有個缺陷,如果要修改簡歷中的...

設計模式之九 原型模式 簡歷複製

原型模式 prototype 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。原型模式其實就是從乙個物件再建立另外乙個可定製的物件,而且不需要知道任何建立的細節。一般在初始化的資訊不發生變化的情況下,轉殖是最好的辦法。這既隱藏了物件建立的細節,又對效能是大大的提高。淺複製 被複製物件...

大話設計模式九 原型模式(簡歷影印)

淺複製 被複製物件的所有變數都含有與原來的物件相同的值,而所有的其它物件的引用都仍然指向原來的物件。工作經歷類 public class workexperience public void setworkdate string workdate public string getcompany p...