程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php 3種基本設計模式的組合使用

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

編輯:關於PHP編程

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');

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved