該文章屬於《編程中的那些經典套路——設計模式彙總》系列,而且如下內容基於語言PHPphp
在設計模式中,單例模式和工廠模式)能夠說是使用的最廣泛的設計模式了,因此掌握此種模式尤其重要。java
單例模式通常使用在資源共享和須要控制資源的狀況下。mysql
例如:購物車,回收站,數據庫鏈接池,計數器,配置文件共享等全部項目中只須要存在一個的模塊,你均可以採用單例模式。redis
單例模式的好處就在於當前進程只產生一個對象(或者叫作模塊),
但有一點須要指出,若是單例模式的操做對象是一個資源類型,那麼此時的單例模式並非純粹的單例模式,由於php的生命週期僅僅是頁面級別的,因此他沒法像Java語言那樣在內存中將這個資源類型存起來,而且咱們也沒法藉助相似redis的nosql緩存數據庫,由於資源類型(相似mysql_connect的返回值)是沒法被序列化(指的是資源沒法轉成字符串)。sql
即,php的單例,僅指進程中單例,不似java,在整個內存中單例,因此在PHP語言下,單例模式是有瑕疵的。數據庫
上代碼:編程
單例模式.phpsegmentfault
<?php class Database { //數據庫鏈接資源 protected static $_db; //單例標識符 protected static $_instance; //設可見性設置成private,防止外部進行 實例化操做 private function __construct(){ } //外部調用的是 getInstance public static function getInstance(){ if (self :: $_instance === null) { self::$_instance = new self(); self::$_db = mysql_connect('localhost','root','root'); echo '只有一次實例化'; } return self::$_instance; } public function select_db($db){ return mysql_select_db($db,self::$_db); } //設可見性設置成private,防止外部進行 clone操做 private function __clone(){ } } $db = Database::getInstance(); print_r($db->select_db('test')); print_r($db->select_db('test')); print_r($db->select_db('test')); //output:只有一次實例化111 ?>
經過輸出(output)能夠看出頁面執行中,數據庫類(class Database)只有第一次調用的時候是真實實例化的,剩下的調用都是直接從靜態變量獲取該實例的,這樣的話就防止了在一次生命週期中屢次鏈接數據庫了,極大的節省了資源,這就是單例模式。設計模式