溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用注冊(cè)樹(shù)及工廠模式來(lái)替代使用單例模式實(shí)踐

發(fā)布時(shí)間:2020-08-05 09:36:56 來(lái)源:億速云 閱讀:194 作者:Leah 欄目:編程語(yǔ)言

今天就跟大家聊聊有關(guān)如何使用注冊(cè)樹(shù)及工廠模式來(lái)替代使用單例模式實(shí)踐,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。


實(shí)現(xiàn)代碼

注冊(cè)器模式非常容易理解和實(shí)現(xiàn)。一般會(huì)有一個(gè)屬性用來(lái)存放多個(gè)對(duì)象實(shí)例,以及set及get方法。set方法用來(lái)將對(duì)象實(shí)例保存在屬性數(shù)組中,get方法用來(lái)或取想要的對(duì)象實(shí)例。

class Registry
{
    // 保存實(shí)例對(duì)象
    private static $objs = [];
    
    // get獲取實(shí)例對(duì)象
    public static function get(string $alias) : Object
    {
        if (!isset(self::$objs[$alias])) {
            throw new \Exception($alias . 'not found');
        }
        
        return self::$objs[$alias];
    }
    
    // set將實(shí)例對(duì)象注冊(cè)到屬性$objs中
    public static function set (string $alias, Object $obj) : void
    {
        if (!isset(self::$objs[$alias])) {
            self::$objs[$alias] = $obj;
        }
    }
    
    // 注銷實(shí)例
    public static function unset (string $alias) :void
    {
        if (isset(self::$objs[$alias])) {
            unset(self::$objs[$alias]);
        }
    }
}

使用注冊(cè)樹(shù)模式和工廠模式來(lái)代替單例模式

我們知道,單例是非常有用的,可以避免資源浪費(fèi)等。但是,單例模式已經(jīng)被認(rèn)為是一種反面模式了,認(rèn)為單例模式不好測(cè)試及維護(hù)。關(guān)于為什么單例模式被認(rèn)為是反面模式,這里就不細(xì)說(shuō)了,有興趣的朋友可以自行谷歌。

那么,我們有沒(méi)有其他的方法用來(lái)保證單例,但不使用單例模式呢?有的,我們可以使用注冊(cè)樹(shù)模式和工廠模式來(lái)替代單例模式。下面是具體代碼:

class Registry
{
    // 保存實(shí)例對(duì)象
    private static $objs = [];
    
    // get獲取實(shí)例對(duì)象
    public static function get(string $alias) 
    {
        if (!isset(self::$objs[$alias])) {
            return null;
        }
        return self::$objs[$alias];
    }
    
    // set將實(shí)例對(duì)象注冊(cè)到屬性$objs中
    public static function set (string $alias, Object $obj) : void
    {
        if (!isset(self::$objs[$alias])) {
            self::$objs[$alias] = $obj;
        }
    }
    
    // 注銷實(shí)例
    public static function unset (string $alias) :void
    {
        if (isset(self::$objs[$alias])) {
            unset(self::$objs[$alias]);
        }
    }
}

class DbFactory
{
    const ALIAS = 'Db';
    
    public static function create ()
    {
        $db = Registry::get(self::ALIAS);
        if (!$db) {
            $db = new Db([
                'host' => 'localhost',
                'user' => 'root',
                'pass' => '',
                'db_name' => 'test'
            ]);
            Registry::set(self::ALIAS, $db);
        }
        
        return $db;
    }
}

當(dāng)我們需要Db實(shí)例是,只要去調(diào)用DbFactory::create即可,該方法保證了單例。下面是測(cè)試代碼:

$db = DbFactory::create();
var_dump($db);


看完上述內(nèi)容,你們對(duì)如何使用注冊(cè)樹(shù)及工廠模式來(lái)替代使用單例模式實(shí)踐有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI