欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP設(shè)計(jì)模式之簡單工廠和工廠模式實(shí)例分析

 更新時(shí)間:2019年03月25日 10:48:58   作者:12345987  
這篇文章主要介紹了PHP設(shè)計(jì)模式之簡單工廠和工廠模式,結(jié)合實(shí)例形式分析了php設(shè)計(jì)模式中工廠模式的實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了PHP設(shè)計(jì)模式之簡單工廠和工廠模式。分享給大家供大家參考,具體如下:

工廠模式是創(chuàng)建型模式的一種,分為簡單工廠模式,工廠模式,抽象工廠模式,簡單工廠可以稱之為工廠模式的一個(gè)特例

先用一段簡單的代碼說明一下,現(xiàn)在假設(shè)我們是顧客,需要蘋果味飲料和香蕉味飲料

<?php
class AppleDrink{
  function getDrinkName()
  {
    echo '蘋果飲料';
  }
}
class BananaDrink{
  function getDrinkName()
  {
    echo '香蕉飲料';
  }
}
//顧客1
$apple = new AppleDrink();
$apple->getDrinkName();
echo "<br/>";
$banana = new BananaDrink();
$banana->getDrinkName();
echo "<br/>";
//顧客2
$apple1 = new AppleDrink();
$apple1->getDrinkName();
echo "<br/>";
$banana1 = new BananaDrink();
$banana1->getDrinkName();

運(yùn)行結(jié)果:

蘋果飲料
香蕉飲料
蘋果飲料
香蕉飲料

這是最基本的寫法,顧客和飲料是強(qiáng)耦合關(guān)系,也就是咱們平常說的硬編碼

有一天,老板覺得AppleDrink這個(gè)名字在國內(nèi)不好賣,想要改成Xingmu(醒目)這種接中國地氣的名字(麥當(dāng)勞改成金拱門)

你會(huì)發(fā)現(xiàn),需要去代碼中找到每一處NEW的地方,全部改成new Xingmu()

如果它還有其他的初始化步驟,就更是噩夢,很可能會(huì)引起一些不必要的麻煩

下面咱們用簡單工廠模式,更改一下這個(gè)文件

<?php
class AppleDrink{
  function getDrinkName()
  {
    echo '蘋果飲料';
  }
}
class BananaDrink{
  function getDrinkName()
  {
    echo '香蕉飲料';
  }
}
class FruitFactory{
  function makeDrink($fruit){
    if ($fruit == 'apple'){
      return new AppleDrink();
    }elseif ($fruit == 'banana'){
      return new BananaDrink();
    }
  }
}
$factory = new FruitFactory();
$apple = $factory->makeDrink('apple');
$apple->getDrinkName();
echo "<br/>";
$banana = $factory->makeDrink('banana');
$banana->getDrinkName();
echo "<br/>";
$apple1 = $factory->makeDrink('apple');
$apple1->getDrinkName();
echo "<br/>";
$banana1 = $factory->makeDrink('banana');
$banana1->getDrinkName();

運(yùn)行結(jié)果:

蘋果飲料
香蕉飲料
蘋果飲料
香蕉飲料

現(xiàn)在我們發(fā)現(xiàn),假如說老板想改名字,我只需要把FruitFactory里的new AppleDrink改為new Xingmu()即可,其他地方都不需要改動(dòng),也不用翻代碼找哪些地方用new了,實(shí)現(xiàn)了顧客和飲料之間的解耦,也符合面向?qū)ο蟮脑O(shè)計(jì)思想,我只是想要一瓶飲料,我并不需要了解這個(gè)飲料是怎么制造出來的

這就是簡單工廠模式,用戶在使用時(shí)可以直接根據(jù)工廠類去創(chuàng)建所需的實(shí)例,而無需了解這些對(duì)象是如何創(chuàng)建以及如何組織的,外界與具體類隔離開來,耦合性低,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化,適用于工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少,客戶只知道傳入了工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象(邏輯)不關(guān)心,簡單工廠模式又叫靜態(tài)工廠模式 可以把工廠類的方法寫成靜態(tài)方法 在不需要實(shí)例化工廠的前提下 直接調(diào)用靜態(tài)方法 返回所需實(shí)例

好的,那么接下來,問題又來了,公司準(zhǔn)備多元化產(chǎn)品,增加桔子味飲料,那么我們需要怎么做呢,首先要增加桔子味飲料類,然后需要在工廠里增加判斷,當(dāng)水果標(biāo)識(shí)是orange的時(shí)候,返回桔子味飲料

class OrangeDrink{
  function getDrinkName()
  {
    echo '桔子味飲料';
  }
}
class FruitFactory{
  function makeDrink($fruit){
    if ($fruit == 'apple'){
      return new AppleDrink();
    }elseif ($fruit == 'banana'){
      return new BananaDrink();
    }elseif ($fruit == 'orange'){
      return new OrangeDrink();
    }
  }
}

然后當(dāng)以后每次需要增加新的產(chǎn)品時(shí),我們都需要更改工廠文件,當(dāng)對(duì)象生成復(fù)雜的時(shí)候,這個(gè)工廠文件會(huì)越來越大,更改或許會(huì)引起一些意想不到的問題

面向?qū)ο蟮脑O(shè)計(jì)原則,對(duì)擴(kuò)展開放,對(duì)更改關(guān)閉,那么有沒有辦法,在不更改原有代碼的基礎(chǔ)上,增加產(chǎn)品呢

答案是有的,咱們再改寫一下這個(gè)方法

<?php
interface Drink{
  function getDrinkName();
}
class AppleDrink implements Drink{
  function getDrinkName()
  {
    echo '蘋果味飲料';
  }
}
class BananaDrink implements Drink{
  function getDrinkName()
  {
    echo '香蕉味飲料';
  }
}
interface FruitFactory{
  function makeDrink();
}
class AppleFactory implements FruitFactory{
  function makeDrink()
  {
    return new AppleDrink();
  }
}
class BananaFactory implements FruitFactory{
  function makeDrink()
  {
    return new BananaDrink();
  }
}
$appleFactory = new AppleFactory();
$apple = $appleFactory->makeDrink();
$apple->getDrinkName();
echo "<br/>";
$bananaFactory = new BananaFactory();
$banana = $bananaFactory->makeDrink();
$banana->getDrinkName();

運(yùn)行結(jié)果:

蘋果味飲料
香蕉味飲料

現(xiàn)在當(dāng)再次需要增加桔子味飲料時(shí),只需要增加桔子味飲料產(chǎn)品和桔子味飲料工廠即可,不需要改動(dòng)原來的代碼

class OrangeDrink implements Drink{
  function getDrinkName()
  {
    echo '桔子味飲料';
  }
}
class OrangeFactory implements FruitFactory{
  function makeDrink()
  {
    return new OrangeDrink();
  }
}

這就是工廠模式,它是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實(shí)現(xiàn)開閉原則,實(shí)現(xiàn)了對(duì)擴(kuò)展開放,對(duì)更改關(guān)閉。其次實(shí)現(xiàn)更復(fù)雜的層次結(jié)構(gòu),可以應(yīng)用于產(chǎn)品結(jié)果復(fù)雜的場合。工廠方法模式是對(duì)簡單工廠模式進(jìn)行了抽象。有一個(gè)抽象的Factory類(可以是抽象類和接口),這個(gè)類將不在負(fù)責(zé)具體的產(chǎn)品生產(chǎn),而是只制定一些規(guī)范,具體的生產(chǎn)工作由其子類去完成。在這個(gè)模式中,工廠類和產(chǎn)品類往往可以依次對(duì)應(yīng)。即一個(gè)抽象工廠對(duì)應(yīng)一個(gè)抽象產(chǎn)品,一個(gè)具體工廠對(duì)應(yīng)一個(gè)具體產(chǎn)品,這個(gè)具體的工廠就負(fù)責(zé)生產(chǎn)對(duì)應(yīng)的產(chǎn)品。

總結(jié):

無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬于工廠模式,在形式和特點(diǎn)上也是極為相似的,他們的最終目的都是為了解耦。在使用時(shí),我們不必去在意這個(gè)模式到底工廠方法模式還是抽象工廠模式,因?yàn)樗麄冎g的演變常常是令人琢磨不透的。經(jīng)常你會(huì)發(fā)現(xiàn),明明使用的工廠方法模式,當(dāng)新需求來臨,稍加修改,加入了一個(gè)新方法后,由于類中的產(chǎn)品構(gòu)成了不同等級(jí)結(jié)構(gòu)中的產(chǎn)品族,它就變成抽象工廠模式了;而對(duì)于抽象工廠模式,當(dāng)減少一個(gè)方法使的提供的產(chǎn)品不再構(gòu)成產(chǎn)品族之后,它就演變成了工廠方法模式。所以,在使用工廠模式時(shí),只需要關(guān)心降低耦合度的目的是否達(dá)到了

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

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 使用PHPStorm+XDebug搭建單步調(diào)試環(huán)境

    使用PHPStorm+XDebug搭建單步調(diào)試環(huán)境

    由于 PhpStorm 不像 Zend 公司為 Zend Studio 那樣配套集成了很多開發(fā)部件,包括解釋器、調(diào)試器、虛擬機(jī)、服務(wù)器、開發(fā)框架等等。因此,配置 PhpStorm 開發(fā)環(huán)境相對(duì)較繁瑣,有很多需要注意的地方。
    2017-11-11
  • 什么是OneThink oneThink后臺(tái)添加插件步驟

    什么是OneThink oneThink后臺(tái)添加插件步驟

    這篇文章主要為大家詳細(xì)介紹了oneThink后臺(tái)添加插件的具體實(shí)現(xiàn)步驟,內(nèi)容簡單,步驟完整,感興趣的小伙伴們可以參考一下
    2016-04-04
  • mysql_escape_string()函數(shù)用法分析

    mysql_escape_string()函數(shù)用法分析

    這篇文章主要介紹了mysql_escape_string()函數(shù)用法,結(jié)合實(shí)例形式講述了mysql_escape_string()函數(shù)的功能,并分析了mysql_escape_string的使用技巧與注意事項(xiàng),需要的朋友可以參考下
    2016-04-04
  • thinkphp使用phpmailer發(fā)送郵件的方法

    thinkphp使用phpmailer發(fā)送郵件的方法

    這篇文章主要介紹了thinkphp使用phpmailer發(fā)送郵件的方法,包含了配置發(fā)送郵件類、設(shè)置參數(shù)及發(fā)送郵件測試等的具體步驟,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-11-11
  • html靜態(tài)頁面調(diào)用php文件的方法

    html靜態(tài)頁面調(diào)用php文件的方法

    這篇文章主要介紹了html靜態(tài)頁面調(diào)用php文件的方法,在進(jìn)行應(yīng)用程序開發(fā)過程中非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-11-11
  • 通過PHP CLI實(shí)現(xiàn)簡單的數(shù)據(jù)庫實(shí)時(shí)監(jiān)控調(diào)度

    通過PHP CLI實(shí)現(xiàn)簡單的數(shù)據(jù)庫實(shí)時(shí)監(jiān)控調(diào)度

    繼續(xù)CLI模式試驗(yàn),這次通過使用之前的“帶延時(shí)的死循環(huán)”方法,來實(shí)現(xiàn)個(gè)簡單的數(shù)據(jù)庫實(shí)時(shí)監(jiān)控調(diào)度功能。
    2009-07-07
  • PHP curl批處理及多請求并發(fā)實(shí)現(xiàn)方法分析

    PHP curl批處理及多請求并發(fā)實(shí)現(xiàn)方法分析

    這篇文章主要介紹了PHP curl批處理及多請求并發(fā)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了php curl并發(fā)請求處理相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • PHP反射基礎(chǔ)知識(shí)回顧

    PHP反射基礎(chǔ)知識(shí)回顧

    這篇文章主要介紹了PHP 反射的相關(guān)資料,幫助大家回顧和理解PHP的相關(guān)知識(shí),感興趣的朋友可以了解下
    2020-09-09
  • PHP中include/require/include_once/require_once使用心得

    PHP中include/require/include_once/require_once使用心得

    include() 、require()語句包含并運(yùn)行指定文件。這兩結(jié)構(gòu)在包含文件上完全一樣,唯一的區(qū)別是對(duì)于錯(cuò)誤的處理。require()語句在遇到包含文件不存在,或是出錯(cuò)的時(shí)候,就停止即行,并報(bào)錯(cuò)。include()則繼續(xù)即行。
    2016-08-08
  • php獲取網(wǎng)頁請求狀態(tài)程序示例

    php獲取網(wǎng)頁請求狀態(tài)程序示例

    對(duì)于網(wǎng)頁返回狀態(tài)代碼多數(shù)情況下我們的查看方法就是使用站長工具或ff瀏覽器等來查看,極少有人想到自己寫一個(gè)查看狀態(tài)代碼的功能,本文就此簡述php獲取網(wǎng)頁請求狀態(tài)程序示例,需要的朋友可以參考下
    2014-06-06

最新評(píng)論