今天就跟大家聊聊有關(guān)如何使用注冊樹及工廠模式來替代使用單例模式實踐,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)建站專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、裕安網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為裕安等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
實現(xiàn)代碼
注冊器模式非常容易理解和實現(xiàn)。一般會有一個屬性用來存放多個對象實例,以及set及get方法。set方法用來將對象實例保存在屬性數(shù)組中,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]); } } }
使用注冊樹模式和工廠模式來代替單例模式
我們知道,單例是非常有用的,可以避免資源浪費等。但是,單例模式已經(jīng)被認為是一種反面模式了,認為單例模式不好測試及維護。關(guān)于為什么單例模式被認為是反面模式,這里就不細說了,有興趣的朋友可以自行谷歌。
那么,我們有沒有其他的方法用來保證單例,但不使用單例模式呢?有的,我們可以使用注冊樹模式和工廠模式來替代單例模式。下面是具體代碼:
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; } }
當(dāng)我們需要Db實例是,只要去調(diào)用DbFactory::create即可,該方法保證了單例。下面是測試代碼:
$db = DbFactory::create(); var_dump($db);
看完上述內(nèi)容,你們對如何使用注冊樹及工廠模式來替代使用單例模式實踐有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。