設計模式是一套被重複使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重複使用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。
毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使程式碼編制真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。
單例模式
當需要保證某個物件只能有一個實例的時候,單例模式非常有用。它把建立物件的控制權委託到一個單一的點上,任何時候應用程式都只會只有一個實例存在。單例類別不應該可以在類別的外部進行實例化一個單例類別應該具備以下幾個要素。
必須擁有一個存取等級為 private 的建構子,有效防止類別被隨意實例化。
必須擁有一個保存類別的實例的靜態變數。
必須擁有一個存取這個實例的公共的靜態方法,該方法通常被命名為 GetInstance()。
必須擁有一個私有的空的clone方法,防止實例被複製複製。
下面用一個簡單的單例類別的例子來說明
class ClassName { public static $_instance; private function construct() { # code... } private function clone() { # empty } public static function GetInstance() { if(!(self::$_instance instanceof self)) { self::$_instance = new self(); } return self::$_instance; } public function SayHi() { echo "Hi boy!"; } } $App= ClassName::GetInstance(); $App->SayHi(); /** * * Output * * Hi boy! * */
當你有大量的實作相同介面的類別的時候,在適當的時候實例化適當的類,如果把這些new 分散到專案的各個角落,不僅會使業務邏輯變的混亂並且使得專案難以維護。這時候如果引進工廠模式的概念,就能很好的處理這個問題。我們也可以透過應用程式配置或提供參數的形式讓工廠類別為我們傳回合適的實例。
工廠類,它把實例化類別的過程放到各工廠類別裡頭,專門用來建立其他類別的物件。工廠模式往往配合介面一起使用,這樣應用程式就不必要知道這些被實例化的類別的具體細節,只要知道工廠傳回的是支援某個介面的類別可以很方便的使用了。以下簡單舉例說明下工廠類別的使用。
interface ProductInterface { public function showProductInfo(); } class ProductA implements ProductInterface { function showProductInfo() { echo 'This is product A.'; } } class ProductB implements ProductInterface { function showProductInfo() { echo 'This is product B.'; } } class ProductFactory { public static function factory($ProductType) { $ProductType = 'Product' . strtoupper($ProductType); if(class_exists($ProductType)) { return new $ProductType(); } else { throw new Exception("Error Processing Request", 1); } } } //这里需要一个产品型号为 A 的对象 $x = ProductFactory::factory('A'); $x -> showProductInfo(); //这里需要一个产品型号为 B 的对象 $o = ProductFactory::factory('B'); $o -> showProductInfo(); //都可以调用showProductInfo方法,因为都实现了接口 ProductInterface.
小結
模式就像是軟體工程的基石脈絡像大樓的設計圖一樣,這裡接觸了兩種模式:單例模式和工程模式。單例類別中存在一個靜態變數保存自身的一個實例,並且提供了一個取得這個靜態變數的靜態方法。單例類別也應該把建構子和clone函數標記為私有的,防止破換實例的唯一性。工廠模式根據傳入的參數或程序的配置來創建不同的類型實例,工廠類別返回的是對象,工廠類別在多態性程式實踐中是至關重要的。
以上是php單例模式與工廠模式用法實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!