php 3種基本設計模式的組合使用

1.1 工廠模式,工廠方法或者類生成對象,而不是在代碼直接new

    class Factory{      
        static function getDatabase(){
            return new Mysql($host, $user, $pass);
        }
    }
    #使用
    Factory::getDatabase();

1.2 單例模式,使某個類的對象僅運行創建一個

  • 1.有個私有的靜態對象變量,專門存放本類的對象
  • 2.有個靜態的方法來創建對象
  • 3.有個私有的構造函數,防止外部new對象
  • 4.有個clone方法,防止clone return false
    參考文章單例模式
class Database {  
    //單一對象屬性  
    private static $instance;  
    //定義一些全局變量需要存放屬性  
    private $props = array();  

    //私有的構造方法  
    private function __construct(){  
        echo 'into construct! 該類不允許外部創建對象
        ';  
    }  

    //返回單一實例  
    public static function getInstance () {  
        //判斷是否已經有了實例化的對象  
        if(empty(self::$instance)) {  
            //可以被override (動態解析)  
            self::$instance = new static();  
            //不可以被override (靜態解析)  
            //self::$instance = new self();  
        }  

        return self::$instance;  
    }  

    public function __clone(){
        return '該類禁止clone';
    }

    //設置屬性  
    public function setProperty ( $key, $value) {  
        $this->props[$key] = $value;  
    }  

    //獲取屬性  
    public function getPeoperty ( $key ) {  
        return $this->props[$key];  
    }  
}  

//使用 
$dbObj = Database::getInstance();  
$dbObj->setProperty('root_path','/www');  
$dbObj->setProperty('tmp_path','/tmp');  

//接下來刪除該單例對象,如果還能獲取到剛剛添加的屬性,說明使用的是同一個對象  
unset($dbObj);  

$dbObj = Database::getInstance();  
echo $dbObj->getPeoperty('root_path');  
echo $dbObj->getPeoperty('tmp_path');  

1.3 註冊模式,全局共享和交換對象

  • 1.將同一個需要多次使用對象統一註冊添加別名,統一調用使用, (比如客戶買一個機器肯定是去工廠認定的機構去買,而不是每個人都去工廠去買)
  • 2.當下一次想使用一個對象的時候,不需要使用工廠,也不需要使用單例模式,直接在註冊器上獲取就可以了
    class Register (){
        protected static $objects;

        function set($alias, $object){
            self::$objects[$alias] = $objects;
        }

        function get($alias){
            return self::$objects[$alias];
        }

        function _unset($alias){
            unset(self::$objects[$alias]);
        }
    }

2.總結使用

    class Factory{      
        static function getDatabase(){
            //單例模式獲取數據對象
            $dbObj = Database::getInstance();
            //註冊到全局樹上
            Register::set('db1', $dbObj);
        }
    }
    #使用
    //第一次主文件裏面
    Factory::getDatabase();
    //以後使用數據庫對象直接訪問
    Register::get('db1');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章