日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

基础设计模式:单例模式+工厂模式+注册树模式

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基础设计模式:单例模式+工厂模式+注册树模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單例模式:

通過提供自身共享實例的訪問,單例設計模式用于限制特定對象只能被創建一次。

使用場景:

一般數據庫實例都會用單例模式

實現:

單例設計模式就是要一個類只能實例化一個對象。

要想讓一個類只能實例化一個對象,就要讓類先不能實例化對象,就是構造方法私有。

現在,要想實例化該類必須通過訪問靜態方法來實例化改類

為了防止實例多次,需要通過一個成員變量來控制加以判斷

因為靜態方法不能訪問非靜態成員,所以聲明的成員也要是靜態的,同時防止外部訪問該成員,還要私有

class Singleton{private static $_instance;  //聲明一個私有的,靜態的成員屬性$instance;private function __construct(){}  //構造方法私有,防止new實例化。public static function getInstance(){     //只能通過靜態方法實例化對象if( !( self::$_instance instanceof Singleton ) )self::$_instance = new self();return self::$obj;}
private function __clone(){} //防止clone對象
  
private function __wakeup(){} //防止使用序列化。

  function query($sql){echo $sql;} }
/*通過靜態方法實例化*/ $db = Singleton::getInstance();//訪問對象中的成員 $db->query("select * from user");

?工廠模式:

工廠類就是一個專門用來創建其它對象的類。所有地方加載類都走工廠方法。

注冊樹模式:

小工程并不實用,對于大工程方便管理生成對象。

三個模式的結合使用:

一個數據庫的單例模式,通過工廠方法調用,生成的對象注冊到注冊樹中。

<?php/*** 單例模式*/
trait Singleton
{private static $_instance;private function __construct(){}public static function getInstance(){if (!(self::$_instance instanceof Singleton)) {self::$_instance = new Static();}return self::$_instance;}final private function __clone(){}
}/*** 數據庫類,通過trait使用單例模式*/
class Database{use Singleton;public function query($sql){//return ret...
    }
}/*** 工廠方法,生成對象*/
class Loader
{/*** 創建對象方法,創建成功加入注冊樹* @param $cls* @return null|static*/public static function loadObject($cls){$obj = ObjectFinder::find($cls);if (!is_object($obj)) {$obj = $cls::getInstance();ObjectFinder::register($cls, $obj);}return $obj;}
}/*** 注冊樹類,存取工廠創建好的對象*/
class ObjectFinder
{protected static $_object;/*** 獲取類對應的對象* @param $cls* @return null*/public static function find($cls){if (isset(self::$_object[$cls])) {return self::$_object[$cls];}return null;}/*** 注冊對象* @param $cls* @param $obj* @return bool*/public static function register($cls, $obj){if (!is_object($obj) || isset(self::$_object[$cls])) {return false;}self::$_object[$cls] = $obj;return true;}/*** 銷毀對象* @param $cls*/public static function destory($cls){if (self::find($cls)) {unset(self::$_object[$cls]);}}
}//創建一個
$db = Loader::loadObject("Database");

?

轉載于:https://www.cnblogs.com/leezhxing/p/3647369.html

總結

以上是生活随笔為你收集整理的基础设计模式:单例模式+工厂模式+注册树模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。