一起聊聊PHP的幾個設計模式 阿新 • • 發佈:2020-07-21 工廠模式 1、簡單工廠模式 目的 簡單工廠模式是一個精簡版的工廠模式。 它與靜態工廠模式最大的區別是它不是『靜態』的。因為非靜態,所以你可以擁有多個不同引數的工廠,你可以為其建立子類。甚至可以模擬(Mock)他,這對編寫可測試的程式碼來講至關重要。 這也是它比靜態工廠模式受歡迎的原因! UML 圖 程式碼 SimpleFactory.php Bicycle.php 用法 測試 Tests/SimpleFactoryTest.php 2、靜態工廠模式 目的 與抽象工廠模式類似,此模式用於建立一系列相關或相互依賴的物件。 『靜態工廠模式』與『抽象工廠模式』的區別在於,只使用一個靜態方法來建立所有型別物件, 此方法通常被命名為 factory 或 build。 例子 Zend Framework: Zend_Cache_Backend 或 _Frontend 使用工廠方法建立快取後端或前端 UML 圖 程式碼 StaticFactory.php FormatterInterface.php FormatString.php FormatNumber.php 測試 Tests/StaticFactoryTest.php 3、抽象工廠模式 目的 在不指定具體類的情況下建立一系列相關或依賴物件。 通常建立的類都實現相同的介面。 抽象工廠的客戶並不關心這些物件是如何建立的,它只是知道它們是如何一起執行的。 UML 圖 程式碼 Product.php ShippableProduct.php DigitalProduct.php ProductFactory.php Test Tests/AbstractFactoryTest.php 單例模式 單例模式確保某個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 單例模式是一種常見的設計模式,在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、資料庫操作、顯示卡的驅動程式常被設計成單例。 單例模式分3種:懶漢式單例、餓漢式單例、登記式單例。 單例模式有以下3個特點: 1.只能有一個例項。 2.必須自行建立這個例項。 3.必須給其他物件提供這一例項。 那麼為什麼要使用PHP單例模式? PHP一個主要應用場合就是應用程式與資料庫打交道的場景,在一個應用中會存在大量的資料庫操作,針對資料庫控制代碼連線資料庫的行為,使用單例模式可以避免大量的new操作。因為每一次new操作都會消耗系統和記憶體的資源。 策略模式 策略模式是物件的行為模式,用意是對一組演算法的封裝。動態的選擇需要的演算法並使用。 策略模式指的是程式中涉及決策控制的一種模式。策略模式功能非常強大,因為這個設計模式本身的核心思想就是面向物件程式設計的多形性思想。 策略模式的三個角色: 1.抽象策略角色 2.具體策略角色 3.環境角色(對抽象策略角色的引用) 實現步驟: 1.定義抽象角色類(定義好各個實現的共同抽象方法) 2.定義具體策略類(具體實現父類的共同方法) 3.定義環境角色類(私有化申明抽象角色變數,過載構造方法,執行抽象方法) 就在程式設計領域之外,有許多例子是關於策略模式的。例如: 如果我需要在早晨從家裡出發去上班,我可以有幾個策略考慮:我可以乘坐地鐵,乘坐公交車,走路或其它的途徑。每個策略可以得到相同的結果,但是使用了不同的資源。 策略模式的程式碼例項: 觀察者模式 1:觀察者模式(Observer),當一個物件狀態發生變化時,依賴它的物件全部會收到通知,並自動更新。 2:場景:一個事件發生後,要執行一連串更新操作。傳統的程式設計方式,就是在事件的程式碼之後直接加入處理的邏輯。當更新的邏輯增多之後,程式碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體程式碼。 3:觀察者模式實現了低耦合,非侵入式的通知與更新機制。 定義一個事件觸發抽象類。 定義一個觀察者介面 實現: 註冊模式 註冊模式,解決全域性共享和交換物件。已經建立好的物件,掛在到某個全域性可以使用的陣列上,在需要使用的時候,直接從該陣列上獲取即可。將物件註冊到全域性的樹上。任何地方直接去訪問。 介面卡模式 將各種截然不同的函式介面封裝成統一的API。 PHP中的資料庫操作有MySQL,MySQLi,PDO三種,可以用介面卡模式統一成一致,使不同的資料庫操作,統一成一樣的API。類似的場景還有cache介面卡,可以將memcache,redis,file,apc等不同的快取函式,統一成一致。 首先定義一個介面(有幾個方法,以及相應的引數)。然後,有幾種不同的情況,就寫幾個類實現該介面。將完成相似功能的函式,統一成一致的方法。 MySQL MySQLi &nbs