摘要:原型設(shè)計(jì)模式中,原型設(shè)計(jì)模式的關(guān)鍵是要了解如何使用內(nèi)置函數(shù)抽象原型角色聲明一個(gè)克隆自身的接口具體原型角色實(shí)現(xiàn)一個(gè)克隆自身的操作原型設(shè)計(jì)模式的目的通過克隆以減少實(shí)例化對(duì)象的開銷,與其實(shí)例化新對(duì)象,完全可以使用一個(gè)已有實(shí)例的克隆注意類是原型設(shè)計(jì)
原型設(shè)計(jì)模式
Notice:
PHP中,原型設(shè)計(jì)模式的關(guān)鍵是要了解如何使用內(nèi)置函數(shù)__clone()
抽象原型角色(Prototype):聲明一個(gè)克隆自身的接口
具體原型角色(ConcretePrototype):實(shí)現(xiàn)一個(gè)克隆自身的操作
原型設(shè)計(jì)模式的目的: 通過克隆以減少實(shí)例化對(duì)象的開銷,與其實(shí)例化新對(duì)象,完全可以使用一個(gè)已有實(shí)例的克隆
注意Client類是原型設(shè)計(jì)模式中不可缺少的一部分
模型:
如果一個(gè)項(xiàng)目要求你創(chuàng)建某個(gè)原型對(duì)象的多個(gè)實(shí)例,就可以使用原型設(shè)計(jì)模式
原型模式還可以用來創(chuàng)建一種組織結(jié)構(gòu),可以根據(jù)實(shí)際的組織來創(chuàng)建和填充其中的位置
克隆與構(gòu)造函數(shù)克隆不會(huì)啟動(dòng)構(gòu)造函數(shù)中的動(dòng)作,但是可以進(jìn)行賦值之類的操作,比如$this->act = "action" 這樣的操作會(huì)被執(zhí)行,但是如果要"print $this->act",那么這個(gè)打印的動(dòng)作將不會(huì)被執(zhí)行
這就意味著原型設(shè)計(jì)模式不能依賴于構(gòu)造函數(shù)提供重要的輸出或返回結(jié)果
構(gòu)造函數(shù)不要做具體的工作,如果一個(gè)類實(shí)例化要完成大量初始化,結(jié)果往往不靈活,而且這是過渡耦合的設(shè)計(jì)
并不是說構(gòu)造函數(shù)不能根據(jù)需要賦值,而是它與模式中其它參與者不同,因?yàn)樗枰騾⑴c者做出請(qǐng)求
使用__clone()函數(shù)存在限制,但這些限制可能更有助于完成更好的OOP程序
下面用一個(gè)基于OOP的實(shí)例來解釋原型模式
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(); //實(shí)例化市場(chǎng)類、管理類、工程類 $Tess = clone $this->market; //將剛實(shí)例化的市場(chǎng)類克隆過來 $this->setEmployee($Tess, "Tess Smith", 101, "ts101-1234", "/tess.png"); //設(shè)置雇員的信息 $this->showEmployee($Tess); //展示雇員的信息,根據(jù)方法所要求的傳遞一個(gè)對(duì)象進(jìn)去 $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) { //根據(jù)傳遞進(jìn)來的值,設(shè)置雇員的姓名、部門、id以及圖片的路徑 //這里是調(diào)用了從父類中繼承過來的方法、以及自身的方法 $employeeNow->setName($nm); $employeeNow->setDept($dp); $employeeNow->setId($id); $employeeNow->setPic("$pic"); } } $worker = new Client(); ?>
上面我省略了engineer類和Management類,你可以根據(jù)Marketing直接復(fù)制然后進(jìn)行修改
PS:本文參考書籍:《Learning PHP設(shè)計(jì)模式》第2部分第6章
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/21262.html
摘要:維基百科有對(duì)這類模式的定義在軟件工程中,創(chuàng)建型模式是處理對(duì)象對(duì)象計(jì)算機(jī)科學(xué)創(chuàng)建的設(shè)計(jì)模式設(shè)計(jì)模式計(jì)算機(jī),試圖根據(jù)實(shí)際情況使用合適的方式創(chuàng)建對(duì)象。接下來本文將繼續(xù)介紹創(chuàng)建型模式中的另兩種模式建造者模式和原型模式,文中的代碼已托管在上。 前言 前兩篇文章介紹了單例模式和工廠模式,這兩種設(shè)計(jì)模式實(shí)際上都屬于軟件工程中的創(chuàng)建型模式(Creational Pattern)。維基百科有對(duì)這類模式的...
摘要:內(nèi)部迭代與使用迭代器顯式迭代的集合不同,流的迭代操作是在背后進(jìn)行的。流只能遍歷一次請(qǐng)注意,和迭代器類似,流只能遍歷一次。 流(Stream) 流是什么 流是Java API的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合(通過查詢語句來表達(dá),而不是臨時(shí)編寫一個(gè)實(shí)現(xiàn))。就現(xiàn)在來說,你可以把它們看成遍歷數(shù)據(jù)集的高級(jí)迭代器。此外,流還可以透明地并行處理,你無需寫任何多線程代碼了!我會(huì)在后面的筆記中...
摘要:繼續(xù)分享設(shè)計(jì)模式的公開課,這是第四篇?jiǎng)?chuàng)建型模式之原型模式設(shè)計(jì)模式的一般介紹在第一篇文章講了,不了解的可以先看看。設(shè)計(jì)模式的第一部分,創(chuàng)建型模式就總結(jié)完了。下面還有兩部分結(jié)構(gòu)型設(shè)計(jì)模式和行為型設(shè)計(jì)模式稍后繼續(xù)。 繼續(xù)分享設(shè)計(jì)模式的公開課,這是第四篇?jiǎng)?chuàng)建型模式之原型模式 設(shè)計(jì)模式的一般介紹在第一篇文章講了,不了解的可以先看看。 原型模式: 用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這個(gè)...
摘要:我們分三篇文章來總結(jié)一下設(shè)計(jì)模式在中的應(yīng)用,這是第一篇?jiǎng)?chuàng)建型模式。二提煉設(shè)計(jì)模式的幾個(gè)原則開閉原則模塊應(yīng)對(duì)擴(kuò)展開放,而對(duì)修改關(guān)閉。工廠模式實(shí)現(xiàn)定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。設(shè)計(jì)模式的第一部分,創(chuàng)建型模式就總結(jié)完了。 我們分三篇文章來總結(jié)一下設(shè)計(jì)模式在PHP中的應(yīng)用,這是第一篇?jiǎng)?chuàng)建型模式。一、設(shè)計(jì)模式簡(jiǎn)介 首先我們來認(rèn)識(shí)一下什么是設(shè)計(jì)模式: 設(shè)計(jì)模式是一套被反復(fù)使...
摘要:利用工廠方法模式,請(qǐng)求者發(fā)出請(qǐng)求,而不具體創(chuàng)建產(chǎn)品。正是因?yàn)檫@個(gè)原因,使用工廠方法模式可以簡(jiǎn)化復(fù)雜的創(chuàng)建過程,關(guān)鍵就在于它在維持一個(gè)公共接口。 創(chuàng)建型設(shè)計(jì)模式 包括以下五種: 抽象工廠 生成器 工廠方法 原型 單例 我們選擇工廠方法和原型模式作為將用PHP實(shí)現(xiàn)的創(chuàng)建型設(shè)計(jì)的例子工廠方法模式是這5個(gè)設(shè)計(jì)模式中唯一的一種類設(shè)計(jì)模式原型模式屬于對(duì)象類模式,可以使用PHP_clone方法實(shí)...
閱讀 1411·2021-11-22 15:25
閱讀 3431·2021-10-21 09:38
閱讀 1636·2021-10-19 13:21
閱讀 1053·2021-09-06 15:00
閱讀 1748·2019-08-30 15:44
閱讀 2642·2019-08-29 15:40
閱讀 3589·2019-08-29 13:44
閱讀 2133·2019-08-26 16:56