久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

php設計模式中工廠模式有什么用

148次閱讀
沒有評論

共計 2894 個字符,預計需要花費 8 分鐘才能閱讀完成。

這篇文章將為大家詳細講解有關 php 設計模式中工廠模式有什么用,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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

工廠模式的最大優點在于創建對象上面,就是把創建對象的過程封裝起來,這樣隨時可以產生一個新的對象。
減少代碼進行復制粘帖,耦合關系重,牽一發動其他部分代碼。

通俗的說,以前創建一個對象要使用 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;
  }

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

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

定義以下幾個類:

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

關于“php 設計模式中工廠模式有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-20發表,共計2894字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 邢台县| 吴忠市| 台北市| 罗田县| 呈贡县| 囊谦县| 南澳县| 赤水市| 禄丰县| 奈曼旗| 临海市| 定西市| 铅山县| 新郑市| 锦州市| 台北县| 阳曲县| 云梦县| 四平市| 景洪市| 瑞安市| 牡丹江市| 敖汉旗| 万全县| 望江县| 西城区| 台山市| 汾西县| 凭祥市| 广元市| 神木县| 正镶白旗| 柳江县| 浙江省| 吉林省| 阿荣旗| 鲁甸县| 广汉市| 灌云县| 大田县| 资溪县|