設計模式 -建立型模式
學習設計模式之前,先來了解下設計模式的5大原則。(也有說6大原則,基本上差不多)
- 單一職責原則
儘量讓一個類負責一個功能。減少複雜度和後期維護成本。
- 開閉原則
允許對類進行繼承拓展,但是不建議對類進行修改。
- 里氏替換原則
子類必須保持和父類行為的相容。重寫方法時,對基類進行行為拓展,而不是完全替換。
- 介面隔離原則
儘量細化介面粒度,使其功能專一,避免客戶端的類實現不需要的行為。
- 依賴倒置原則
高層次類不應該依賴低層次的類。輔助開閉原則,建立高層次介面,底層次類依賴高層次抽象介面。
低層次的類實現基礎操作。
高層次類包含複雜業務邏輯以指導底層次類執行特定操作。
注:5大原則僅作為設計模式的參考。
建立型模式
-提供建立物件的機制, 增加已有程式碼的靈活性和可複用性。
工廠方法模式
- 父類提供一個建立物件的方法,允許子類決定例項化物件的型別。
-靜態方法是類與外界的介面, 返回的是一個物件。
<?php
//建立介面 interface transport { public function go(); } //建立實現介面的實體類 class bike implements transport { public function go() { echo "bike跑的慢"; } } class car implements transport {public function go() { echo "car開的快"; } } //建立一個工廠,生成基於給定資訊的實體類的物件。 class transFactory { public static function factory($transport) { switch ($transport) { case 'bike': return new bike(); break; case 'car': returnnew car(); break; } } } $transport = transFactory::factory('car'); $transport->go();
- 使用場景
1、無法預知物件確切類別及其依賴關係時。工廠方法將建立產品的程式碼與實際使用產品的程式碼分離,從而能在不影響其他程式碼的情況下擴充套件產品建立部分程式碼。
2、後期需要拓展你的邏輯功能。
3、希望複用現有物件來節省系統資源,而不是每次都重新建立物件。
- 優點
1、你可以避免建立者和具體產品之間的緊密耦合。
2、 單一職責原則。你可以將產品建立程式碼放在程式的單一位置,從而使得程式碼更容易維護。
3、開閉原則。無需更改現有客戶端程式碼,你就可以在程式中引入新的產品型別。
- 缺點
應用工廠方法模式需要引入許多新的子類,程式碼可能會因此變得更復雜。最好的情況是將該模式引入建立者類的現有層次結構中。
單例模式
-能夠保證一個類只有一個例項,並提供一個訪問該例項的全域性節點。
- 一個類只能有一個例項且該例項只能自己建立。
1 <?php 2 class Singleton 3 { 4 //新增私有靜態成員變數用於儲存單例例項 5 private static $instance; 6 7 //申明公有靜態方法用於獲取單例例項 8 public static function getInstance() 9 { 10 if (empty(self::$instance)) self::$instance = new self(); 11 12 return self::$instance; 13 } 14 15 //私有預設構造方法,保證外界無法直接例項化 16 private function __construct() 17 { 18 } 19 20 //防止使用者克隆例項 21 public function __clone() 22 { 23 die('clone is not allow'); 24 } 25 26 public function test() 27 { 28 echo 'Singleton test is success'; 29 } 30 }
- 使用場景
1、想控制例項數目,節省系統資源的時候。
2、需要更加嚴格地控制全域性變數,可以使用單例模式。
- 優點
1、在記憶體裡只有一個例項,僅在首次請求單例物件時對其進行初始化,減少了記憶體的開銷,尤其是頻繁的建立和銷燬例項(比如管理學院首頁頁面快取)。
2、避免對資源的多重佔用(比如寫檔案操作)。
3、獲得了一個指向該例項的全域性訪問節點。
- 缺點
1、沒有介面,無法繼承。
2、該模式在多執行緒環境下需要進行特殊處理,避免多個執行緒多次建立單例物件。
3、違反單一職責原則。
後續待更新。。