最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP 面向?qū)ο蟪绦蛟O(shè)計(oop)學(xué)習(xí)筆記(三) - 單例模式和工廠模式

 更新時間:2014年06月12日 10:06:13   投稿:hebedich  
設(shè)計模式是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

毫無疑問,設(shè)計模式于己于他人于系統(tǒng)都是多贏的;設(shè)計模式使代碼編制真正工程化;設(shè)計模式是軟件工程的基石脈絡(luò),如同大廈的結(jié)構(gòu)一樣。

單例模式

當(dāng)需要保證某個對象只能有一個實例的時候,單例模式非常有用。它把創(chuàng)建對象的控制權(quán)委托到一個單一的點上,任何時候應(yīng)用程序都只會僅有一個實例存在。單例類不應(yīng)該可以在類的外部進(jìn)行實例化一個單例類應(yīng)該具備以下幾個要素。

必須擁有一個訪問級別為 private 的構(gòu)造函數(shù),有效防止類被隨意實例化。

必須擁有一個保存類的實例的靜態(tài)變量。

必須擁有一個訪問這個實例的公共的靜態(tài)方法,該方法通常被命名為 GetInstance()。

必須擁有一個私有的空的__clone方法,防止實例被克隆復(fù)制。

下面用一個簡單的單例類的例子來說明

復(fù)制代碼 代碼如下:

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!
 *
 */

簡單工廠模式

當(dāng)你有大量的實現(xiàn)同一接口的類的時候,在合適的時候?qū)嵗线m的類,如果把這些 new 分散到項目的各個角落,不僅會使業(yè)務(wù)邏輯變的混亂并且使得項目難以維護。這時候如果引進(jìn)工廠模式的概念,就能很好的處理這個問題。我們還可以通過應(yīng)用程序配置或者提供參數(shù)的形式讓工廠類為我們返回合適的的實例。

工廠類,它把實例化類的過程放到各工廠類里頭,專門用來創(chuàng)建其他類的對象。工廠模式往往配合接口一起使用,這樣應(yīng)用程序就不必要知道這些被實例化的類的具體細(xì)節(jié),只要知道工廠返回的是支持某個接口的類可以很方便的使用了。下面簡單舉例說明下工廠類的使用。

復(fù)制代碼 代碼如下:

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);
        }
    }
}
//這里需要一個產(chǎn)品型號為 A 的對象
$x = ProductFactory::factory('A');
$x -> showProductInfo();
//這里需要一個產(chǎn)品型號為 B 的對象
$o = ProductFactory::factory('B');
$o -> showProductInfo();
//都可以調(diào)用showProductInfo方法,因為都實現(xiàn)了接口 ProductInterface.

小結(jié)

模式就像是軟件工程的基石脈絡(luò)像大廈的設(shè)計圖紙一樣,這里接觸了兩種模式:單例模式和工程模式。單例類中存在一個靜態(tài)變量保存著自身的一個實例,并且提供了獲取這個靜態(tài)變量的靜態(tài)方法。單例類還應(yīng)該把構(gòu)造函數(shù)和clone函數(shù)標(biāo)記為私有的,防止破換實例的唯一性。工廠模式根據(jù)傳入的參數(shù)或程序的配置來創(chuàng)建不同的類型實例,工廠類返回的是對象,工廠類在多態(tài)性編程實踐中是至關(guān)重要的。

相關(guān)文章

最新評論

洛扎县| 徐水县| 根河市| 错那县| 江山市| 阿城市| 阿坝县| 张家口市| 崇阳县| 临夏县| 自治县| 曲沃县| 贵德县| 武隆县| 攀枝花市| 磐石市| 呈贡县| 荥阳市| 浦北县| 西乌珠穆沁旗| 得荣县| 崇仁县| 云和县| 安康市| 三穗县| 温州市| 饶阳县| 蓝山县| 剑川县| 光山县| 余江县| 富蕴县| 松原市| 揭西县| 太湖县| 清远市| 徐水县| 仪征市| 山东| 南木林县| 晴隆县|