php設(shè)計(jì)模式之單例模式

單例模式

単例模式就是某個(gè)類只有一個(gè)實(shí)例,自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例

単例模式的實(shí)現(xiàn):
1:私有化一個(gè)屬性用于存放唯一的實(shí)例
2:私有化構(gòu)造方法
3:私有化克隆方法,用來(lái)創(chuàng)建并只允許創(chuàng)建一個(gè)實(shí)例
4:公有化靜態(tài)方法,用于向系統(tǒng)提供這個(gè)唯一實(shí)例
<?php
class Singleton {
    //1.私有化屬性存放實(shí)例
    private static $_instance = null;

    //2.私有化構(gòu)造方法
    private function __construct() {

    }

    //3.克隆方法私有化
    private function __clone() {
        // TODO: Implement __clone() method.
    }

    //4.公有化靜態(tài)方法,用于向系統(tǒng)提供這個(gè)唯一實(shí)例
    public function getInstance() {
        //如果不是當(dāng)前類的實(shí)例,那么實(shí)例化當(dāng)前類創(chuàng)建新實(shí)例
        if(!self::$_instance instanceof self){
            self::$_instance = new self();
        }
        return self::$_instance;
    }
}

$obj1 = Singleton::getInstance();
$obj2 = Singleton::getInstance();
$obj3 = Singleton::getInstance();

var_dump($obj1,$obj2,$obj3);
#輸出
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}

因?yàn)殪o態(tài)方法可以在全局范圍內(nèi)被訪問(wèn),當(dāng)我們需要一個(gè)單例模式的對(duì)象時(shí),只需調(diào)用getInstance方法,獲取先前實(shí)例化的對(duì)象,無(wú)需重新實(shí)例化。

因?yàn)殪o態(tài)方法可以在全局范圍內(nèi)被訪問(wèn),當(dāng)我們需要一個(gè)單例模式的對(duì)象時(shí),只需調(diào)用getInstance方法,獲取先前實(shí)例化的對(duì)象,無(wú)需重新實(shí)例化。

優(yōu)點(diǎn): 1、在內(nèi)存里只有一個(gè)實(shí)例,減少了內(nèi)存的開(kāi)銷,尤其是頻繁的創(chuàng)建和銷毀實(shí)例(比如管理學(xué)院首頁(yè)頁(yè)面緩存)。 2、避免對(duì)資源的多重占用(比如寫文件操作)。

缺點(diǎn):沒(méi)有接口,不能繼承,與單一職責(zé)原則沖突,一個(gè)類應(yīng)該只關(guān)心內(nèi)部邏輯,而不關(guān)心外面怎么樣來(lái)實(shí)例化。

使用場(chǎng)景: 1、要求生產(chǎn)唯一序列號(hào)。 2、WEB 中的計(jì)數(shù)器,不用每次刷新都在數(shù)據(jù)庫(kù)里加一次,用單例先緩存起來(lái)。 3、創(chuàng)建的一個(gè)對(duì)象需要消耗的資源過(guò)多,比如 I/O 與數(shù)據(jù)庫(kù)的連接等。

注意事項(xiàng):getInstance() 方法中需要使用同步鎖 synchronized 防止多線程同時(shí)進(jìn)入造成 instance 被多次實(shí)例化

上一篇 php設(shè)計(jì)模式之工廠模式
下一篇 php設(shè)計(jì)模式之注冊(cè)樹(shù)模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容