原型模式其實更形象的來說應該叫轉殖模式。它主要的行為是對物件進行轉殖,但是又把被轉殖的物件稱之為最初的原型,於是,這個模式就這樣被命名了。說真的,從使用方式來看真的感覺叫轉殖模式更貼切一些。
gof定義:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件
gof類圖**實現首先我們通過模擬的方式定義了乙個原型,這裡主要是模擬了__clone()這個方法。其實這是php自帶的乙個魔術方法,根本是不需要我們去進行定義的,只需要在原型類中進行實現就可以了。當外部使用clone關鍵字進行物件轉殖時,直接就會進入這個魔術方法中。在這個魔術方法裡面我們可以對屬性進行處理,特別是針對引用屬性進行一些獨特的處理。在這個例子中,我們只使用了乙個值型別的變數。無法體現出引用型別的問題,我們將在後面的例項中演示對引用型別變數的處理。abstract
class
prototype
abstract
public
function
__clone()
;}
模擬的具體實現的原型,其實就是主要去具體的實現__clone()方法。後面我們看具體的例子時再說明。class
concreteprototype1
extends
prototype
}class
concreteprototype2
extends
prototype
}
客戶端使用clone來複製$p1,可以看到$p2也具有相同的$v屬性。class
client}$c
=new
client()
;$c->
operation()
;
我們的手機作業系統(也可以想象一下pc電腦的作業系統),都是怎樣安裝到裝置中呢?其實都是不停的複製拷貝最初的那一套系統。用微軟的例子非常好說明這個問題,當年微軟能夠成為乙個帝國,其實也是因為他不停的將winodws作業系統拷貝複製到光碟中,然後賣給千家萬戶(當然,這裡沒中國什麼事兒)。而中國市場呢,大量的高手破解了windows之後也是由這乙份檔案不停的複製拷貝才裝到了我們的電腦中。手機、智慧型裝置等各類產品的作業系統、軟體都是如此。一次開發無限拷貝正是軟體行業暴利的原因。畢竟我們的系統也是由不少的工程師日以繼夜的996在android原生系統的基礎上開發出來的,趕緊不斷的複製到即將出廠的手機上吧!!
完整**:
同樣還是拿手機來說事兒,這次我們是根據不同的運營商需要去開發一批定製機,也就是**機。這批手機說實話都並沒有什麼不同,大部分都是相同的配置,但是運營商系統不同,而且偶爾有一些型號的cpu和記憶體也可能存在不同。這個時候,我們就可以用原型模式來進行快速的複製並且只修改一部分不相同的地方啦。
原型模式生產手機類圖完整原始碼:
<?php
inte***ce
serviceprovicer
class
chinamobile
implements
serviceprovicer
}class
chinaunicom
implements
serviceprovicer
}class
phone
class
cmphone
extends
phone
}class
cuphone
extends
phone
}$cmphone
=new
cmphone()
;$cmphone
->
cpu=
"1.4g"
;$cmphone
->
rom=
"64g"
;$cmphone
->
service_province
=new
chinamobile()
;$cmphone
->
service_province
->
system
='td-cdma'
;$cmphone1
= clone $cmphone
;$cmphone1
->
service_province
->
system
='td-cdma1'
;var_dump
($cmphone);
var_dump
($cmphone1);
echo
$cmphone
->
service_province
->
getsystem()
;echo
$cmphone1
->
service_province
->
getsystem()
;$cuphone
=new
cuphone()
;$cuphone
->
cpu=
"1.4g"
;$cuphone
->
rom=
"64g"
;$cuphone
->
service_province
=new
chinaunicom()
;$cuphone
->
service_province
->
system
='wcdma'
;$cuphone1
= clone $cuphone
;$cuphone1
->
rom=
"128g"
;$cuphone1
->
service_province
->
system
='wcdma1'
;var_dump
($cuphone);
var_dump
($cuphone1);
echo
$cuphone
->
service_province
->
getsystem()
;echo
$cuphone1
->
service_province
->
getsystem()
;
說明原型模式雖然平常用得不多,但是學習之後發現還真是挺有用的,特別是需要大量的重複物件時,可以大大節約新建物件的資源需求,以後還是需要多多練習早日應用在實際的業務場景中。下乙個又會是誰呢?別急別急,先去下個館子,廚師、服務員、顧客,這三個要素就能組成乙個神奇的模式:命令模式PHP 設計模式之原型模式
1.與工廠模式類似,都是用來建立物件的 2.與工廠模式實現不同,原型模式是先建立好原型物件,然後通過 clone 原型物件來建立新的物件的。這樣就避免了類建立時重複的初始化操作 3.原型模式適用於大物件的建立,每建立乙個大物件需要很大的開銷,如果每次 new 就會消耗很大,原型模式僅需要記憶體拷貝即...
php設計模式之原型模式
原型模式 prototype pattern 與工廠模式類似,都是用來建立物件的。利用轉殖來生成乙個大物件,減少建立時的初始化等操作占用開銷 一 為什麼需要原型模式 1,有些時候,我們需要建立多個類似的大物件。如果直接通過new物件,開銷很大,而且new完還得進行重複的初始化工作。可能把初始化工作封...
PHP 設計模式 原型模式
原型模式 prototype pattern 與工廠模式類似,都是用來建立物件的。利用轉殖來生成乙個大物件,減少建立時的初始化等操作占用開銷 1,有些時候,我們需要建立多個類似的大物件。如果直接通過new物件,開銷很大,而且new完還得進行重複的初始化工作。可能把初始化工作封裝起來的,但是對於系統來...