PHP 物件導向程式設計(oop)學習筆記(三) - 單例模式和原廠模式_php執行個體

來源:互聯網
上載者:User

毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使代碼編製真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。

單例模式

當需要保證某個對象只能有一個執行個體的時候,單例模式非常有用。它把建立對象的控制權委託到一個單一的點上,任何時候應用程式都只會僅有一個執行個體存在。單例類不應該可以在類的外部進行執行個體化一個單例類應該具備以下幾個要素。

必須擁有一個存取層級為 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函數標記為私人的,防止破換執行個體的唯一性。原廠模式根據傳入的參數或程式的配置來建立不同的類型執行個體,工廠類返回的是對象,工廠類在多態性編程實踐中是至關重要的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.