摘要:原型模式是一種創(chuàng)建型設(shè)計(jì)模式,模式允許一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可定制的對(duì)象,根本無(wú)需知道任何如何創(chuàng)建的細(xì)節(jié)。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些
概念
用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。
Prototype原型模式是一種創(chuàng)建型設(shè)計(jì)模式,Prototype模式允許一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可定制的對(duì)象,根本無(wú)需知道任何如何創(chuàng)建的細(xì)節(jié)。
工作原理通過(guò)將一個(gè)原型對(duì)象傳給那個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象,這個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象通過(guò)請(qǐng)求原型對(duì)象拷貝它們自己來(lái)實(shí)施創(chuàng)建。
解決什么問(wèn)題它主要面對(duì)的問(wèn)題是:“某些結(jié)構(gòu)復(fù)雜的對(duì)象”的創(chuàng)建工作;由于需求的變化,這些對(duì)象經(jīng)常面臨著劇烈的變化,但是他們卻擁有比較穩(wěn)定一致的接口。
角色抽象原型(Prototype)角色:聲明一個(gè)克隆自身的接口
具體原型(Concrete Prototype)角色:實(shí)現(xiàn)一個(gè)克隆自身的操作
結(jié)構(gòu)圖 代碼 淺copy模式直接copy,拷貝了源對(duì)象的引用地址等,所以原來(lái)內(nèi)容變化,新內(nèi)容變化。
name = $name; } public function setName($name) { $this->name=$name; } public function getName() { return $this->name; } /** * 拷貝自身 * * @return ConcretePrototype 返回自身 */ public function copy() { return clone $this;//淺拷貝 } } /** * 測(cè)試潛拷貝 */ class LatentCopyDemo{ public $array; } /** * Class Client 客戶端 */ class Client{ /** * 測(cè)試方法 */ public static function test(){ $demo = new LatentCopyDemo(); $demo->array = array(1,2); $object1 = new ConcretePrototype($demo); $object2 = $object1->copy(); var_dump($object1->getName()); echo "
"; var_dump($object2->getName()); echo "
"; $demo->array = array(3, 4); var_dump($object1->getName()); echo "
"; var_dump($object2->getName()); echo "
"; } } Client::test();
運(yùn)行結(jié)果
object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } } object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } }深拷貝模式
深copy通過(guò)序列化和反序列化完成copy,新copy的內(nèi)容完全復(fù)制原來(lái)的內(nèi)容。原來(lái)的內(nèi)容變化,新內(nèi)容不變。
name = $name; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } /** * 拷貝自身 * * @return ConcretePrototype 返回自身 */ public function copy() { $serialize_obj = serialize($this); $clone_obj = unserialize($serialize_obj); return $clone_obj; } } /** * 測(cè)試潛拷貝 */ class DeepCopyDemo{ public $array; } /** * Class Client 客戶端 */ class Client{ /** * 測(cè)試方法 */ public static function test(){ $demo = new DeepCopyDemo(); $demo->array = array(1,2); $object1 = new ConcretePrototype($demo); $object2 = $object1->copy(); var_dump($object1->getName()); echo "
"; var_dump($object2->getName()); echo "
"; $demo->array = array(3, 4); var_dump($object1->getName()); echo "
"; var_dump($object2->getName()); echo "
"; } } Client::test();
運(yùn)行結(jié)果
object(DeepCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(DeepCopyDemo)#4 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(DeepCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } } object(DeepCopyDemo)#4 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } }優(yōu)點(diǎn)和缺點(diǎn) 優(yōu)點(diǎn)
1、可以在運(yùn)行時(shí)刻增加和刪除產(chǎn)品
2、可以改變值以指定新對(duì)象
3、可以改變結(jié)構(gòu)以指定新對(duì)象
4、減少子類的構(gòu)造
5、用類動(dòng)態(tài)配置應(yīng)用
Prototype模式的最主要缺點(diǎn)就是每一個(gè)類必須配備一個(gè)克隆方法。
而且這個(gè)克隆方法需要對(duì)類的功能進(jìn)行通盤(pán)考慮,這對(duì)全新的類來(lái)說(shuō)不是很難,但對(duì)已有的類進(jìn)行改造時(shí),不一定是件容易的事。
當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時(shí),要使用Prototype模式
當(dāng)要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí),例如動(dòng)態(tài)加載
為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平等的工廠類層次時(shí);
當(dāng)一個(gè)類的實(shí)例只能有幾個(gè)不同狀態(tài)組合中的一種時(shí)。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/22050.html
摘要:繼續(xù)分享設(shè)計(jì)模式的公開(kāi)課,這是第四篇?jiǎng)?chuàng)建型模式之原型模式設(shè)計(jì)模式的一般介紹在第一篇文章講了,不了解的可以先看看。設(shè)計(jì)模式的第一部分,創(chuàng)建型模式就總結(jié)完了。下面還有兩部分結(jié)構(gòu)型設(shè)計(jì)模式和行為型設(shè)計(jì)模式稍后繼續(xù)。 繼續(xù)分享設(shè)計(jì)模式的公開(kāi)課,這是第四篇?jiǎng)?chuàng)建型模式之原型模式 設(shè)計(jì)模式的一般介紹在第一篇文章講了,不了解的可以先看看。 原型模式: 用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)拷貝這個(gè)...
摘要:原型模式平行的繼承層次使用工廠模式在大型設(shè)計(jì)中,必須去維護(hù)大量的產(chǎn)品類。上文中,稱之為特殊的耦合在這里我們介紹一種其抽象工廠模式的變體原型模式。面向?qū)ο笤O(shè)計(jì)模式目錄 原型模式 平行的繼承層次使用工廠模式在:大型設(shè)計(jì)中,必須去維護(hù)大量的產(chǎn)品類。(上文中,稱之為特殊的耦合) 在這里我們介紹一種其抽象工廠模式的變體:原型模式。它使用clone關(guān)鍵詞,來(lái)復(fù)制具體產(chǎn)品類,使得具體產(chǎn)品類能完成自我...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 1898·2021-11-24 09:39
閱讀 2134·2021-09-22 15:50
閱讀 1991·2021-09-22 14:57
閱讀 700·2021-07-28 00:13
閱讀 1065·2019-08-30 15:54
閱讀 2356·2019-08-30 15:52
閱讀 2686·2019-08-30 13:07
閱讀 3787·2019-08-30 11:27