編程中的那些套路——關於單例模式

該文章屬於《編程中的那些經典套路——設計模式彙總》系列,而且如下內容基於語言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)只有第一次調用的時候是真實實例化的,剩下的調用都是直接從靜態變量獲取該實例的,這樣的話就防止了在一次生命週期中屢次鏈接數據庫了,極大的節省了資源,這就是單例模式。設計模式

該文章屬於《編程中的那些經典套路——設計模式彙總》系列緩存

相關文章
相關標籤/搜索