91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用注冊樹及工廠模式來替代使用單例模式實踐

發布時間:2020-08-05 09:36:56 來源:億速云 閱讀:198 作者:Leah 欄目:編程語言

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


實現代碼

注冊器模式非常容易理解和實現。一般會有一個屬性用來存放多個對象實例,以及set及get方法。set方法用來將對象實例保存在屬性數組中,get方法用來或取想要的對象實例。

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

使用注冊樹模式和工廠模式來代替單例模式

我們知道,單例是非常有用的,可以避免資源浪費等。但是,單例模式已經被認為是一種反面模式了,認為單例模式不好測試及維護。關于為什么單例模式被認為是反面模式,這里就不細說了,有興趣的朋友可以自行谷歌。

那么,我們有沒有其他的方法用來保證單例,但不使用單例模式呢?有的,我們可以使用注冊樹模式和工廠模式來替代單例模式。下面是具體代碼:

class Registry
{
    // 保存實例對象
    private static $objs = [];
    
    // get獲取實例對象
    public static function get(string $alias) 
    {
        if (!isset(self::$objs[$alias])) {
            return null;
        }
        return self::$objs[$alias];
    }
    
    // set將實例對象注冊到屬性$objs中
    public static function set (string $alias, Object $obj) : void
    {
        if (!isset(self::$objs[$alias])) {
            self::$objs[$alias] = $obj;
        }
    }
    
    // 注銷實例
    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;
    }
}

當我們需要Db實例是,只要去調用DbFactory::create即可,該方法保證了單例。下面是測試代碼:

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


看完上述內容,你們對如何使用注冊樹及工廠模式來替代使用單例模式實踐有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

缙云县| 清流县| 北票市| 驻马店市| 武平县| 通州市| 高青县| 商都县| 高平市| 连州市| 巴彦淖尔市| 云和县| 定远县| 沙田区| 靖江市| 鹿泉市| 邳州市| 永福县| 枣庄市| 永州市| 万源市| 金昌市| 普兰县| 资溪县| 正阳县| 浙江省| 永嘉县| 大邑县| 茶陵县| 唐海县| 布拖县| 舞钢市| 巨野县| 襄城县| 田东县| 从化市| 图木舒克市| 德令哈市| 永顺县| 东辽县| 武定县|