1. 程式人生 > 實用技巧 >設計模式 -建立型模式

設計模式 -建立型模式

學習設計模式之前,先來了解下設計模式的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': return
new 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、違反單一職責原則。

後續待更新。。