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