結(jié)論:
雖然注冊(cè)模式簡化了對(duì)大量對(duì)象的訪問,但是仍然有許多問題——與全局變量聯(lián)合。你需要確定要求的屬性Key在訪問之已經(jīng)被初始化了,而且設(shè)置屬性的方法可以全局訪問,你的對(duì)象仍然可能在你的代碼的其他部分出乎意料的被替換掉。顯然,全局?jǐn)?shù)據(jù)非常有好處,方便,但是你需要時(shí)刻記住任何全局?jǐn)?shù)據(jù)都是有一些不安全的。
內(nèi)嵌的Registry模式
除了單獨(dú)使用注冊(cè)模式——如本章所示,Registry模式與其他對(duì)象結(jié)合時(shí)功能也是非常強(qiáng)大。例如:當(dāng)對(duì)象的創(chuàng)建代價(jià)非常昂貴(例如需要查詢大量數(shù)據(jù)庫來初始化對(duì)象)時(shí),而且對(duì)象在這個(gè)應(yīng)用中被使用一次或多次,如果這樣,你能創(chuàng)建一個(gè)結(jié)合了工作模式 (見第三章) 和注冊(cè)模式 的“Finder”類以獲得已經(jīng)創(chuàng)建的對(duì)象的緩存而不用再次創(chuàng)建他們?
以下是一個(gè)Contact類,AddressBook類是工廠類。
代碼:
class AddressBook { function &findById($id) { return new Contact($id); } } class Contact { function Contact($id) { // expensive queries to create object using $id } // ... other methods }
你可以在AddressBook類中插入Registry模式來提供緩存。代碼可以如下所示:
class AddressBook { var $registry; function AddressBook() { $this->registry =& Registry::getInstance(); } function &findById($id) { if (!$this->registry->isValid($id)) { $this->registry->set($id, new Contact($id)); } return $this->registry->get($id); } }
AddressBook類的構(gòu)造函數(shù)將registry綁定到一個(gè)實(shí)例變量。當(dāng)創(chuàng)建了一個(gè)特定的ID并被findById()方法調(diào)用時(shí),Registry被檢查以確定對(duì)象是否已經(jīng)被緩存。如果沒有,將創(chuàng)建一個(gè)新的對(duì)象并存儲(chǔ)在Registry中。被調(diào)用的對(duì)象將通過函數(shù)從Registry中取出并被返回。
本文鏈接:http://www.95time.cn/tech/program/2008/5914.asp
出處:phpchina
責(zé)任編輯:bluehearts
上一頁 php設(shè)計(jì)模式介紹之注冊(cè)模式 [6] 下一頁
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|