在前兩篇單例模式和工廠模式後,終於迎來了最後乙個基礎的設計模式--註冊樹模式。
什麼是註冊樹模式?
註冊樹模式當然也叫註冊模式,註冊器模式。之所以我在這裡矯情一下它的名稱,是因為我感覺註冊樹這個名稱更容易讓人理解。像前兩篇一樣,我們這篇依舊是從名字入手。註冊樹模式通過將物件例項註冊到一棵全域性的物件樹上,需要的時候從物件樹上採摘的模式設計方法。 這讓我想起了小時候買糖葫蘆,賣糖葫蘆的將糖葫蘆插在乙個大的桿子上,人們買的時候就取下來。不同的是,註冊樹模式摘下來還會有,能摘很多次,糖葫蘆摘一次就沒了。。。
為什麼要採用註冊樹模式?
單例模式解決的是如何在整個專案中建立唯一物件例項的問題,工廠模式解決的是如何不通過new建立例項物件的方法。 那麼註冊樹模式想解決什麼問題呢? 在考慮這個問題前,我們還是有必要考慮下前兩種模式目前面臨的侷限。 首先,單例模式建立唯一物件的過程本身還有一種判斷,即判斷物件是否存在。存在則返回物件,不存在則建立物件並返回。 每次建立例項物件都要存在這麼一層判斷。 工廠模式更多考慮的是擴充套件維護的問題。 總的來說,單例模式和工廠模式可以產生更加合理的物件。怎麼方便呼叫這些物件呢?而且在專案內如此建立的物件好像散兵游勇一樣,不便統籌管理安排啊。因而,註冊樹模式應運而生。不管你是通過單例模式還是工廠模式還是二者結合生成的物件,都統統給我「插到」註冊樹上。我用某個物件的時候,直接從註冊樹上取一下就好。這和我們使用全域性變數一樣的方便實用。 而且註冊樹模式還為其他模式提供了一種非常好的想法。
如何實現註冊樹?
通過上述的描述,我們似乎很容易就找到了解決方法。首先我們需要乙個作為註冊樹的類,這毋庸置疑。所有的物件「插入」到註冊樹上。這個註冊樹應該由乙個靜態變數來充當。而且這個註冊樹應該是乙個二維陣列。這個類應該有乙個插入物件例項的方法(set()),當讓相對應的就應該有乙個撤銷物件例項的方法(_unset())。當然最重要的是還需要有乙個讀取物件的方法(get())。擁有這些,我們就可以愉快地完成註冊樹模式啦~~~
下面讓三種模式做個小小的結合。單純建立乙個例項物件遠遠沒有這麼複雜,但運用於大型專案的話,便利性便不言而喻了。
<?php至此,三種模式設計介紹完畢。各種模式設計本身就會相輔相成,往後介紹其他模式的時候,多多少少會用到一種或多種其他設計模式。//建立單例
classsingle
static public functiongetinstance()
self::$ins=newself();
return self::$ins;
} }//工廠模式
classrandfactory
}//註冊樹
classregister
public static function get($alias)
public static function _unset($alias)
}register::set('rand',randfactory::factory());
$object=register::get('rand');
print_r($object);
一種模式不懂不要緊,相信程式設計的深入,定會產生恍然大悟的驚喜感 ,願諸君與我共進步。
如何註冊資料
最後要考慮的是,只要資料是與其他要素類或表的關係的一部分,就要確保以相同方式在關係雙方註冊資料。非版本化 支援的資料型別 除拓撲 幾何網路 網路資料集或地形中的要素類以外的所有資料型別 除拓撲 幾何網路 網路資料集或地形中的要素類以外的所有資料型別 所有資料型別 支援的工作流 簡單工作流 帶有版本的...
FastReport註冊資料來源
using smart.controls 一 註冊引數 public override void initreport fastreport.report report 注意 經使用發現這種方法註冊引數有乙個致命的缺點,就是引數只能在報表首次建立時傳入,如果報表設計好想再加引數似乎不可能。考慮到後期...
PHP 註冊樹模式
概念 將已經建立好的物件註冊到某個容器裡,在需要使用的時候直接從容器獲取即可。優勢 解決全域性共享和交換物件,將物件註冊到全域性的樹上任何地方直接去訪問。具體註冊樹和被註冊類 示例 註冊樹 class register public static function get alias public ...