摘要:原型設計模式中,原型設計模式的關鍵是要了解如何使用內置函數抽象原型角色聲明一個克隆自身的接口具體原型角色實現一個克隆自身的操作原型設計模式的目的通過克隆以減少實例化對象的開銷,與其實例化新對象,完全可以使用一個已有實例的克隆注意類是原型設計
原型設計模式
Notice:
PHP中,原型設計模式的關鍵是要了解如何使用內置函數__clone()
抽象原型角色(Prototype):聲明一個克隆自身的接口
具體原型角色(ConcretePrototype):實現一個克隆自身的操作
原型設計模式的目的: 通過克隆以減少實例化對象的開銷,與其實例化新對象,完全可以使用一個已有實例的克隆
注意Client類是原型設計模式中不可缺少的一部分
模型:
如果一個項目要求你創建某個原型對象的多個實例,就可以使用原型設計模式
原型模式還可以用來創建一種組織結構,可以根據實際的組織來創建和填充其中的位置
克隆與構造函數克隆不會啟動構造函數中的動作,但是可以進行賦值之類的操作,比如$this->act = "action" 這樣的操作會被執行,但是如果要"print $this->act",那么這個打印的動作將不會被執行
這就意味著原型設計模式不能依賴于構造函數提供重要的輸出或返回結果
構造函數不要做具體的工作,如果一個類實例化要完成大量初始化,結果往往不靈活,而且這是過渡耦合的設計
并不是說構造函數不能根據需要賦值,而是它與模式中其它參與者不同,因為它需要向參與者做出請求
使用__clone()函數存在限制,但這些限制可能更有助于完成更好的OOP程序
下面用一個基于OOP的實例來解釋原型模式
name = $emName; } public function getName() { return $this->name; } // ID public function setId($emId) { $this->id = $emId; } public function getId() { return $this->id; } // Name public function setPic($ePic) { $this->employeePic = $ePic; } public function getPic() { return $this->employeePic; } abstract function __clone(); } ?>
dept = $this->sales; break; case 102: $this->dept = $this->promotion; break; case 103: $this->dept = $this->strategic; break; default: $this->dept = "Unreconized Marketing"; } } public function getDept(){ return $this->dept; } function __clone(){} } ?>
makeConProto(); //實例化市場類、管理類、工程類 $Tess = clone $this->market; //將剛實例化的市場類克隆過來 $this->setEmployee($Tess, "Tess Smith", 101, "ts101-1234", "/tess.png"); //設置雇員的信息 $this->showEmployee($Tess); //展示雇員的信息,根據方法所要求的傳遞一個對象進去 $Jacob = clone $this->market; $this->setEmployee($Jacob, "Jacob Jones", 102, "jj101-2234", "/jacob.png"); $this->showEmployee($Jacob); $Ricky = clone $this->manage; $this->setEmployee($Ricky, "Ricky Rodrigues", 203, "rr203-5634", "/ricky.png"); $this->showEmployee($Ricky); $Olivia = clone $this->engineer; $this->setEmployee($Olivia, "Olivia Perez", 302, "op301-1278", "/olivia.png"); $this->showEmployee($Olivia); $John = clone $this->engineer; $this->setEmployee($John, "John Smith", 301, "jj302-1454", "/john.png"); $this->showEmployee($John); } private function makeConProto() { $this->market = new Marketing(); $this->manage = new Management(); $this->engineer = new Engineering(); } private function showEmployee(IAcmePrototype $employeeNow) { $pic = $employeeNow->getPic(); //獲取雇員的圖片路徑 echo ""; echo $employeeNow->getName() . "
"; echo $employeeNow->getDept() . ":" . $employeeNow::UNIT . "
"; echo $employeeNow->getId() . ""; } private function setEmployee(IAcmePrototype $employeeNow, $nm, $dp, $id, $pic) { //根據傳遞進來的值,設置雇員的姓名、部門、id以及圖片的路徑 //這里是調用了從父類中繼承過來的方法、以及自身的方法 $employeeNow->setName($nm); $employeeNow->setDept($dp); $employeeNow->setId($id); $employeeNow->setPic("$pic"); } } $worker = new Client(); ?>
上面我省略了engineer類和Management類,你可以根據Marketing直接復制然后進行修改
PS:本文參考書籍:《Learning PHP設計模式》第2部分第6章
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21262.html
摘要:維基百科有對這類模式的定義在軟件工程中,創建型模式是處理對象對象計算機科學創建的設計模式設計模式計算機,試圖根據實際情況使用合適的方式創建對象。接下來本文將繼續介紹創建型模式中的另兩種模式建造者模式和原型模式,文中的代碼已托管在上。 前言 前兩篇文章介紹了單例模式和工廠模式,這兩種設計模式實際上都屬于軟件工程中的創建型模式(Creational Pattern)。維基百科有對這類模式的...
摘要:內部迭代與使用迭代器顯式迭代的集合不同,流的迭代操作是在背后進行的。流只能遍歷一次請注意,和迭代器類似,流只能遍歷一次。 流(Stream) 流是什么 流是Java API的新成員,它允許你以聲明性方式處理數據集合(通過查詢語句來表達,而不是臨時編寫一個實現)。就現在來說,你可以把它們看成遍歷數據集的高級迭代器。此外,流還可以透明地并行處理,你無需寫任何多線程代碼了!我會在后面的筆記中...
摘要:繼續分享設計模式的公開課,這是第四篇創建型模式之原型模式設計模式的一般介紹在第一篇文章講了,不了解的可以先看看。設計模式的第一部分,創建型模式就總結完了。下面還有兩部分結構型設計模式和行為型設計模式稍后繼續。 繼續分享設計模式的公開課,這是第四篇創建型模式之原型模式 設計模式的一般介紹在第一篇文章講了,不了解的可以先看看。 原型模式: 用原型實例指定創建對象的種類,并且通過拷貝這個...
摘要:我們分三篇文章來總結一下設計模式在中的應用,這是第一篇創建型模式。二提煉設計模式的幾個原則開閉原則模塊應對擴展開放,而對修改關閉。工廠模式實現定義一個用于創建對象的接口,讓子類決定實例化哪一個類。設計模式的第一部分,創建型模式就總結完了。 我們分三篇文章來總結一下設計模式在PHP中的應用,這是第一篇創建型模式。一、設計模式簡介 首先我們來認識一下什么是設計模式: 設計模式是一套被反復使...
摘要:利用工廠方法模式,請求者發出請求,而不具體創建產品。正是因為這個原因,使用工廠方法模式可以簡化復雜的創建過程,關鍵就在于它在維持一個公共接口。 創建型設計模式 包括以下五種: 抽象工廠 生成器 工廠方法 原型 單例 我們選擇工廠方法和原型模式作為將用PHP實現的創建型設計的例子工廠方法模式是這5個設計模式中唯一的一種類設計模式原型模式屬于對象類模式,可以使用PHP_clone方法實...
閱讀 1357·2021-11-22 15:25
閱讀 3350·2021-10-21 09:38
閱讀 1564·2021-10-19 13:21
閱讀 992·2021-09-06 15:00
閱讀 1674·2019-08-30 15:44
閱讀 2578·2019-08-29 15:40
閱讀 3432·2019-08-29 13:44
閱讀 2024·2019-08-26 16:56