最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP設計模式之工廠模式實例總結(jié)

 更新時間:2017年09月01日 12:14:50   作者:王滔  
這篇文章主要介紹了PHP設計模式之工廠模式,簡單介紹了工廠模式的概念、原理并結(jié)合實例形式總結(jié)分析了工廠模式的具體定義及使用方法,需要的朋友可以參考下

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

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

工廠模式的最大優(yōu)點在于創(chuàng)建對象上面,就是把創(chuàng)建對象的過程封裝起來,這樣隨時可以產(chǎn)生一個新的對象。

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

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

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

工廠模式的優(yōu)點就在創(chuàng)建對象上。

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

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

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

為什么引入抽象的概念?

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

工廠方法:

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

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

你的工廠是綜合型的,是生產(chǎn)“一系列”產(chǎn)品,而不是“一個”,比如:生產(chǎn)“香煙”,還有“啤酒”等。然后它也可以有派生出來的具體的工廠,但這些工廠都是生產(chǎn)這一系列產(chǎn)品,只是可能因為地域不一樣,為了適應當?shù)厝丝谖?,味道也不太一樣?/p>

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

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

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

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

這樣子讓我聯(lián)想到框架中經(jīng)常會有負責生成具體類實例的方法供調(diào)用。

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

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

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

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

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

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

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

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

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

的形式

而可以動態(tài)生成一個連接數(shù)據(jù)庫的實例??梢允莔ysql,也可以是連接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 ('對應的數(shù)據(jù)庫類沒找到');
    } 
  }
}
DbFactory::factory("mysql");
DbFactory::factory("oracle");

在thinkphp框架中也有對應的實現(xiàn):

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

Db.class.php中有個factory()方法來創(chuàng)建不同的數(shù)據(jù)庫實例

public function factory($db_config='') {
    // 讀取數(shù)據(jù)庫配置
    $db_config = $this->parseConfig($db_config);
    if(empty($db_config['dbms']))
      throw_exception(L('_NO_DB_CONFIG_'));
    // 數(shù)據(jù)庫類型
    $this->dbType = ucwords(strtolower($db_config['dbms']));
    $class = 'Db'. $this->dbType;
    if(is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) {
      // 內(nèi)置驅(qū)動
      $path = CORE_PATH;
    }else{ // 擴展驅(qū)動
      $path = EXTEND_PATH;
    }
    // 檢查驅(qū)動類
    if(require_cache($path.'Driver/Db/'.$class.'.class.php')) {
      $db = new $class($db_config);
      // 獲取當前的數(shù)據(jù)庫類型
      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;
}

還有做支付接口的時候,未來可能對應不同的支付網(wǎng)關(guān):支付寶、財付通、網(wǎng)銀在線等。方便未來擴展,設計成工廠模式。定一個專門生產(chǎn)網(wǎng)關(guān)接口的工廠,抽象出來,做成接口形式,讓所有的子類都要實現(xiàn)它的接口。以后加一個支付方式,要使用哪一種支付方式,改變一下參數(shù)即可。

書籍<php權(quán)威編程>(英文名稱為PHP 5 Power Programming)也提到一個工廠模式的例子,學到一招:在為用戶注冊的時候,分為很多種角色的用戶。比如冊用戶,匿名用戶、管理員用戶等。完全使用可以使用工廠的思想來實現(xiàn),代碼也容易維護,為每種角色可以生成操作的類。

定義以下幾個類:

UserFactory 用戶工廠類,負責生成不同的用戶類
User:用戶類的基類,所有用戶類都是繼承這個類
不同角色的類:注冊用戶類、匿名用戶類、管理員用戶類

總結(jié)結(jié)束,歡迎指正!

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O計入門教程》、《PHP基本語法入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對大家PHP程序設計有所幫助。

相關(guān)文章

  • Ajax+PHP 邊學邊練 之二 實例

    Ajax+PHP 邊學邊練 之二 實例

    本篇通過一個實例介紹Ajax與PHP結(jié)合使用的方式,可以下載該實例的源程序以便更好理解。壓縮包中functions.js就是Ajax核心代碼了,所有的操作效果都是通過它來實現(xiàn)的。下文的代碼解釋都是提取自functions.js。
    2009-11-11
  • php隱藏IP地址后兩位顯示為星號的方法

    php隱藏IP地址后兩位顯示為星號的方法

    這篇文章主要介紹了php隱藏IP地址后兩位顯示為星號的方法,采用正則匹配的方法來實現(xiàn),是非常實用的技巧,需要的朋友可以參考下
    2014-11-11
  • php使用curl詳細解析及問題匯總

    php使用curl詳細解析及問題匯總

    CURL是一個非常強大的開源庫,支持很多協(xié)議,包括HTTP、FTP、TELNET等,我們使用它來發(fā)送HTTP請求。它給我 們帶來的好處是可以通過靈活的選項設置不同的HTTP協(xié)議參數(shù),并且支持HTTPS。CURL可以根據(jù)URL前綴是“HTTP” 還是“HTTPS”自動選擇是否加密發(fā)送內(nèi)容。
    2016-08-08
  • 詳解PHP中數(shù)組函數(shù)的知識點

    詳解PHP中數(shù)組函數(shù)的知識點

    PHP 的數(shù)組是一種很強大的數(shù)據(jù)類型,與此同時 PHP 內(nèi)置了一系列與數(shù)組相關(guān)的函數(shù)可以很輕易的實現(xiàn)日常開發(fā)的功能。所以本文便總結(jié)了一些在常見場景中利用 PHP 內(nèi)置函數(shù)的實現(xiàn)方法,希望對你有所幫助
    2022-11-11
  • PHP截取漢字亂碼問題解決方法mb_substr函數(shù)的應用

    PHP截取漢字亂碼問題解決方法mb_substr函數(shù)的應用

    利用mb_substr截取字符串不會出現(xiàn)亂碼問題,高手可以飛過......
    2008-03-03
  • phpmail類發(fā)送郵件函數(shù)代碼

    phpmail類發(fā)送郵件函數(shù)代碼

    前天要給網(wǎng)站做一個小功能,就是在用戶留言的時候發(fā)郵件通知管理員。我們都知道在PHP里有一個mail函數(shù),但是要求服務器要有郵件服務器的功能,比如簡單的SMTP或者POP3。但是,如果我們的服務器沒有這種功能,那么怎么辦呢
    2012-02-02
  • php中請求url的五種方法總結(jié)

    php中請求url的五種方法總結(jié)

    最近開發(fā)中遇到一個問題,程序第4行會請求一個url,通過查找相關(guān)的資料發(fā)現(xiàn)有多種方法,本文給大家介紹了關(guān)于php中請求url的五種方法,分別是用fopen()函數(shù)、file()函數(shù)、file_get_contents()函數(shù)、curl() 請求遠程url數(shù)據(jù)和exec() 執(zhí)行命令行命令,下面來一起看看吧。
    2017-07-07
  • php使用Jpgraph繪制復雜X-Y坐標圖的方法

    php使用Jpgraph繪制復雜X-Y坐標圖的方法

    這篇文章主要介紹了php使用Jpgraph繪制復雜X-Y坐標圖的方法,通過設置圖像陰影、邊距、字體、顏色、曲線等實現(xiàn)Jpgraph繪制復雜坐標圖的功能,非常簡單實用,需要的朋友可以參考下
    2015-06-06
  • php實現(xiàn)將任意進制數(shù)轉(zhuǎn)換成10進制的方法

    php實現(xiàn)將任意進制數(shù)轉(zhuǎn)換成10進制的方法

    這篇文章主要介紹了php實現(xiàn)將任意進制數(shù)轉(zhuǎn)換成10進制的方法,涉及php數(shù)制轉(zhuǎn)換的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • php獲取今日開始時間和結(jié)束時間的方法

    php獲取今日開始時間和結(jié)束時間的方法

    本篇文章實例講述了php獲取今日開始時間和結(jié)束時間的方法,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02

最新評論

龙泉市| 广平县| 二连浩特市| 商南县| 彭阳县| 石柱| 广平县| 长宁县| 肥西县| 平谷区| 乌拉特中旗| 喀喇沁旗| 陇西县| 阿城市| 三门县| 贡嘎县| 东兰县| 临江市| 新郑市| 多伦县| 法库县| 敖汉旗| 乌鲁木齐县| 新昌县| 兴城市| 姜堰市| 万源市| 封丘县| 同心县| 民乐县| 同心县| 天等县| 柳林县| 揭西县| 雅安市| 贵德县| 安龙县| 米林县| 柳江县| 龙口市| 夹江县|