今天我們一起來學(xué)習(xí)單例模式:
首先要弄明白,什么叫單例模式?
概念: 在任何時候,應(yīng)用程序中都只會有這個類僅有的一個實(shí)例存在。
單例模式也被認(rèn)為是職責(zé)模式,因?yàn)樗鼘?chuàng)建對象的控制權(quán)委托到一個單一的訪問點(diǎn)上。
其次,這么做的好處在哪?
這可以防止我們?nèi)ゴ蜷_數(shù)據(jù)庫的多個連接或者不必要的使用多余的系統(tǒng)資源。在復(fù)雜的系統(tǒng)中,還可以起到維護(hù)應(yīng)用程序狀態(tài)的作用。
最后:它有哪些典型特征?
1.它至少要有一個構(gòu)造函數(shù),并且被標(biāo)記為私有(PRivate)
2.擁有一個保存類的實(shí)例的靜態(tài)成員變量。
3.擁有一個可以訪問這個實(shí)例的公共的靜態(tài)方法。
和普通類不同的是,單例類不能在其它類中直接實(shí)例化,只能被其自身實(shí)例化。要做到這一點(diǎn),必須要私有化它的構(gòu)造函數(shù),并且防止被克隆。用代碼來實(shí)現(xiàn)一個單例,我們以創(chuàng)建數(shù)據(jù)庫的連接為例:
//get data classclass DB { private $_db; private static $_instance; private function __construct(){ $DSN = '../../content/xxtebook.db'; $this->_db = new PDO('sqlite:'.$DSN); } //初始化數(shù)據(jù)庫連接 public static function initDB(){ if(! (self::$_instance instanceof self)){ self::$_instance = new self(); } return self::$_instance; } //其它方法 private function __clone(){} public function query($sql){} //....}
在外部使用這個單例:
$db = DB::initDB();//$db->somMethod();
另外對于哪些方法用靜態(tài),哪些方法不用,我的想法就是,如果方法內(nèi)部要訪問$this變量的,那么就不應(yīng)當(dāng)用靜態(tài)方法,反之則可以用靜態(tài)。也就是說,靜態(tài)方法不需要通過例實(shí)對象就可以使用。
下一次我們再一起學(xué)習(xí)工廠模式
新聞熱點(diǎn)
疑難解答
圖片精選