久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

PHP設計模式之工廠模式實例總結

這篇文章主要介紹了PHP設計模式之工廠模式,簡單介紹了工廠模式的概念、原理并結合實例形式總結分析了工廠模式的具體定義及使用方法,需要的朋友可以參考下

本文實例講述了PHP設計模式之工廠模式。分享給大家供大家參考,具體如下:

使用工廠模式的目的或目標?

工廠模式的最大優點在于創建對象上面,就是把創建對象的過程封裝起來,這樣隨時可以產生一個新的對象。

減少代碼進行復制粘帖,耦合關系重,牽一發動其他部分代碼。

通俗的說,以前創建一個對象要使用new,現在把這個過程封裝起來了。

假設不使用工廠模式:那么很多地方調用類a,代碼就會這樣子創建一個實例:new a(),假設某天需要把a類的名稱修改,意味著很多調用的代碼都要修改。

工廠模式的優點就在創建對象上。

工廠模式的優點就在創建對象上。建立一個工廠(一個函數或一個類方法)來制造新的對象,它的任務就是把對象的創建過程都封裝起來,

創建對象不是使用new的形式了。而是定義一個方法,用于創建對象實例。

每個類可能會需要連接數據庫。那么就將連接數據庫封裝在一個類中。以后在其他類中通過類名:

為什么引入抽象的概念?

想一想,在現實生活中,當我們無法確定某個具體的東西的時候,往往把一類東西歸于抽象類別。

工廠方法:

比如你的工廠叫做“香煙工廠”,那么可以有“七匹狼工廠”“中華工廠”等,但是,這個工廠只生廠一種商品:香煙;

抽象工廠:無法描述它到底生產什么產品,它生產很多類型的產品(所以抽象工廠就會生成子工廠)。

你的工廠是綜合型的,是生產“一系列”產品,而不是“一個”,比如:生產“香煙”,還有“啤酒”等。然后它也可以有派生出來的具體的工廠,但這些工廠都是生產這一系列產品,只是可能因為地域不一樣,為了適應當地人口味,味道也不太一樣。

工廠模式:理解成只生成一種產品的工廠。比如生產香煙的。

工廠方法:工廠的一種產品生產線 。比如鍵盤的生成過程。

別人會反駁:吃飽了沒事干,一定要修改類名稱呢?這個說不定。一般都不會去修改類名稱。

其實工廠模式有很多變體,抓住精髓才是關鍵:只要是可以根據不同的參數生成不同的類實例,那么就符合工廠模式的設計思想。

這樣子讓我聯想到框架中經常會有負責生成具體類實例的方法供調用。

由于前面使用過phpcms,用phpcms的來幫助理解,更加好,如下:

pc_base:load_app_class("order"');//參數名稱就是類名稱。

將會生成得到order這個實例。傳遞不同的參數得到不同的類實例,這個就符合工廠模式。

pc_base:load_app_class("comment"');//生成一個comment類實例

當然load_app_class這個方法里面還會結合了單件模式的思想。避免調用n次,就重復創建n個相同的實例

工廠模式我想到的一個典型的應用就是:php可能要鏈接mysql,也可能要鏈接sqlserver,還有其他什么數據庫。那么做一個抽象的數據庫類,

這個類就是一個工廠類,專門負責產生不同的對象。

這樣子做很方便擴展。我們在直接鏈接數據庫的時候,不是使用代碼

new Mysql($host,$username,$password,$dbname)

的形式

而可以動態生成一個連接數據庫的實例。可以是mysql,也可以是連接oracle的。

class DbFactory
{
  function static factory($db_class_name)
  {
    $db_class_name = strtolower($db_class_name);
    if (include_once 'Drivers/' . $db_class_name . '.php') {
      $classname = 'Driver_' . $db_class_name;
      return new $db_class_name;
    } else {
      throw new Exception ('對應的數據庫類沒找到');
    } 
  }
}
DbFactory::factory("mysql");
DbFactory::factory("oracle");

在thinkphp框架中也有對應的實現:

Db.class.php就是一個工廠類(也可以叫做數據庫中間層,之所以叫做中間層,是因為可以操作mysql、oracle等各數據庫。而這個類就是中間層作用,屏蔽掉具體的實現。讓程序員可以不改動原來的查詢代碼。中間層來對接mysql、oracle等數據庫。

Db.class.php中有個factory()方法來創建不同的數據庫實例

public function factory($db_config='') {
    // 讀取數據庫配置
    $db_config = $this->parseConfig($db_config);
    if(empty($db_config['dbms']))
      throw_exception(L('_NO_DB_CONFIG_'));
    // 數據庫類型
    $this->dbType = ucwords(strtolower($db_config['dbms']));
    $class = 'Db'. $this->dbType;
    if(is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) {
      // 內置驅動
      $path = CORE_PATH;
    }else{ // 擴展驅動
      $path = EXTEND_PATH;
    }
    // 檢查驅動類
    if(require_cache($path.'Driver/Db/'.$class.'.class.php')) {
      $db = new $class($db_config);
      // 獲取當前的數據庫類型
      if( 'pdo' != strtolower($db_config['dbms']) )
        $db->dbType = strtoupper($this->dbType);
      else
        $db->dbType = $this->_getDsnType($db_config['dsn']);
      if(APP_DEBUG) $db->debug  = true;
    }else {
      // 類沒有定義
      throw_exception(L('_NOT_SUPPORT_DB_').': ' . $db_config['dbms']);
    }
    return $db;
}

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 高清人人天天夜夜曰狠狠狠狠 | 欧美日韩国产三级 | 亚洲午夜av久久乱码 | 亚洲高清视频在线 | 黑人成人网 | 欧美xxxⅹ性欧美大片 | 日本成人久久 | 羞羞网站免费 | a在线免费观看视频 | 日韩av一区在线观看 | 国产成人免费在线 | 免费久久久 | 久久亚洲精品久久国产一区二区 | 狠狠干在线 | 一区二区三区亚洲精品国 | 国产韩国精品一区二区三区 | 国产精品亚洲成在人线 | 可以免费观看的av | 色在线免费 | 欧美一区二区三区四区视频 | 亚洲精品久久久久久久久久久久久 | 老外黄色一级片 | 国产免费看 | 久久久久久成人 | av毛片 | 亚洲一区二区精品视频在线观看 | 国产免费一区二区 | 黄色在线观看网址 | 综合色播 | 成人免费视频网址 | 福利精品 | 国产免费让你躁在线视频 | 一片毛片 | 国产精品久久久久久吹潮 | 99亚洲国产精品 | 99精品久久久 | 免费国产视频在线观看 | 一区二区三区四区不卡视频 | 天天澡天天狠天天天做 | 国产一区二区三区视频在线观看 | 精品国产亚洲一区二区三区大结局 |