国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP 設(shè)計(jì)模式之一——單例模式

rubyshen / 2097人閱讀

摘要:總之,我認(rèn)為單例模式有最重要的兩點(diǎn),保證唯一以及節(jié)省資源。單例模式為了能夠保持運(yùn)行期間唯一并能夠被全局訪問,污染了全局變量。

定義

單例模式(Singleton pattern):一個(gè)類有且僅有一個(gè)實(shí)例,并且自行實(shí)例化后提供給整個(gè)程序使用。

或者可以理解為在整個(gè)程序運(yùn)行期間,保證這個(gè)類有且僅一個(gè)實(shí)例,并對(duì)外提供一個(gè)能夠訪問它的全局訪問點(diǎn)。

應(yīng)用場(chǎng)景

對(duì)于一個(gè)程序來說,某些特殊的類在程序運(yùn)行期間僅僅保證只被實(shí)例化一次很重要。打印服務(wù)是單例模式出鏡率比較高的一個(gè)例子,對(duì)于打印機(jī)同一時(shí)刻只能打印一個(gè)文件,因此出現(xiàn)兩個(gè)打印服務(wù)實(shí)例的時(shí)候,肯定有一個(gè)是處于閑置狀態(tài)浪費(fèi)資源,如果沒有閑置,那么就會(huì)發(fā)生資源爭(zhēng)奪情況,你肯定不會(huì)希望一頁紙上交替打印了兩個(gè)文檔吧。

當(dāng)你打算實(shí)現(xiàn)一個(gè)框架的時(shí)候,如果你是這么思考的,我要先寫一個(gè)核心,其它的諸如框架配置、控制器、視圖、類庫等等都和這個(gè)核心有關(guān)聯(lián),這個(gè)核心從一接到請(qǐng)求就開始運(yùn)行,一直到請(qǐng)求結(jié)束,所有的其它的組件都由核心來實(shí)例化,這個(gè)核心就像一個(gè)樹干一樣,其它的組件都像一條條樹枝掛在主干上,那么這個(gè)核心類最好用單例模式,這時(shí)候你所加載的配置,你所實(shí)例化的各個(gè)組件,在本次運(yùn)行期間就很確定的是由這一個(gè)核心實(shí)例化出來的(因?yàn)闆]有別的啦),那么不論你怎么玩也就不會(huì)發(fā)生 A 實(shí)例下的配置信息被 B 實(shí)例調(diào)用了。

總之,我認(rèn)為單例模式有最重要的兩點(diǎn),保證唯一以及節(jié)省資源。

實(shí)現(xiàn)方法

把構(gòu)造方法用 private 方式隱藏起來,可以防止被其它類 new 出來。

沒了構(gòu)造方法了,那么其它類不能 new 出來這個(gè)類了,那么只能自食其力自己 new 自己了,然而有個(gè)問題,此時(shí)自己是不存在的啊,不存在又怎么運(yùn)行自己 new 自己的方法呢?

因此要使用靜態(tài)方法,靜態(tài)方法可以使用類直接調(diào)用,在靜態(tài)方法中 new 自己,因?yàn)槭窃陬惱铮钥梢詿o視 private 。

雖然 new 出來了,但是不保存起來的話,下次再需要時(shí),不是還需要 new 一次 ,那么也就不是單例了,因此要找個(gè)安全的地方存起來,而靜態(tài)方法只能訪問靜態(tài)的屬性,因此把 new 出來的對(duì)象放到靜態(tài)屬性里吧。

class Singleton {
    private static $_instance;//保存實(shí)例化出來的單例
    //構(gòu)造函數(shù)私有化,確保單例類不能通過其它對(duì)象 new 出來
    private final function __construct() {}
    //定義私有的__clone()方法,這是確保單例類不能被復(fù)制或克隆,否則又不是單例了。
    private function __clone() {}
    public static function getInstance() {
        //檢測(cè)類是否被實(shí)例化,如果沒有實(shí)例化,就 new 一下,已經(jīng)實(shí)例化就直接返回。
        if ( ! (self::$_instance instanceof self) ) {
            self::$_instance = new test();
        }
        return self::$_instance;
    }
}

//拿到單例實(shí)例,多次調(diào)用都是同一個(gè)實(shí)例
Singleton::getInstance();
優(yōu)點(diǎn)

提供了對(duì)唯一實(shí)例達(dá)到受控訪問。

由于在系統(tǒng)內(nèi)存中只存在一個(gè)對(duì)象,因此可以節(jié)約系統(tǒng)資源,對(duì)于一些需要頻繁創(chuàng)建和銷毀的對(duì)象單例模式無疑可以提高系統(tǒng)的性能。

缺點(diǎn)

單例模式破壞了常見的類模式以及沒有抽象層,因擴(kuò)展時(shí)有很大的困難。

單例模式為了能夠保持運(yùn)行期間唯一并能夠被全局訪問,污染了全局變量。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/25649.html

相關(guān)文章

  • 【面向?qū)ο蟮?em>PHP】之模式單例

    摘要:?jiǎn)卫J侥J较盗械拈_篇,首先介紹的是我最喜歡的單例模式,簡(jiǎn)單而言,這屬于生成一個(gè)且只生成一個(gè)對(duì)象實(shí)例的特殊類。問題良好設(shè)計(jì)的系統(tǒng)通過方法調(diào)用傳遞對(duì)象實(shí)例。面向?qū)ο笤O(shè)計(jì)模式目錄 單例模式 模式系列的開篇,首先介紹的是我最喜歡的單例模式(Singleton),簡(jiǎn)單而言,這屬于:生成一個(gè)、且只生成一個(gè)對(duì)象實(shí)例的特殊類。 這個(gè)唯一存在的類,將替代Global關(guān)鍵字,并且更安全。 產(chǎn)生前提 全局...

    崔曉明 評(píng)論0 收藏0
  • 理解php單例模式

    摘要:二為什么用單例實(shí)際項(xiàng)目中像數(shù)據(jù)庫查詢,日志輸出,全局回調(diào),統(tǒng)一校驗(yàn)等模塊。單例模式的好處減少頻繁創(chuàng)建,節(jié)省了。因此在單例模式必須包含三要素私有化構(gòu)造函數(shù),私有化。 單例作為一個(gè)最經(jīng)典的設(shè)計(jì)模式之一,到底什么是單例?為什么要用單例?怎么設(shè)計(jì)單例?php中單例如何具體實(shí)現(xiàn)? 一、什么是單例 wiki百科:?jiǎn)卫J剑步袉巫幽J剑且环N常用的軟件設(shè)計(jì)模式。 在應(yīng)用這個(gè)模式時(shí),單例對(duì)象的類必須...

    xi4oh4o 評(píng)論0 收藏0
  • 大話PHP設(shè)計(jì)模式單例模式

    摘要:上面是簡(jiǎn)單的單例模式,自己寫程序的話夠用了,如果想繼續(xù)延伸,請(qǐng)傳送至大話設(shè)計(jì)模式之單例模式升級(jí)版 看了那么多單例的介紹,都是上來就說怎么做,也沒見說為什么這么做的。那小的就來說說為什么會(huì)有單例這個(gè)模式以便更好的幫助初學(xué)者真正的理解這個(gè)設(shè)計(jì)模式,如果你是大神,也不妨看完指正一下O(∩_∩)O首先我不得不吐槽一下這個(gè)模式名字單例,初學(xué)者通過字面很難理解什么是單例,我覺得應(yīng)該叫唯一模式更貼切...

    VEIGHTZ 評(píng)論0 收藏0
  • PHP設(shè)計(jì)模式-Singleton 單例(單元素)模式

    摘要:大佬看完如果發(fā)現(xiàn)鄙人理解有誤請(qǐng)立即指出,感謝拍磚,跪求鞭打單例單元素模式實(shí)現(xiàn)來自說明通過提供對(duì)自身共享實(shí)例對(duì)訪問,單元素單例設(shè)計(jì)模式用于限制特定對(duì)象只能被創(chuàng)建一次。 整理一下自己的學(xué)習(xí)Aaron Saray 寫的PHP設(shè)計(jì)模式一些demo和自己的理解。大佬看完如果發(fā)現(xiàn)鄙人理解有誤請(qǐng)立即指出,感謝拍磚,跪求鞭打 /** * Singleton 單例(單元素)模式實(shí)現(xiàn) * -----...

    omgdog 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<