《PHP設(shè)計(jì)模式介紹》第三章 工廠模式(5)_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:《PHP設(shè)計(jì)模式介紹》第二章 值對象模式
      在所有的最簡單的程序中,大多數(shù)對象都有一個(gè)標(biāo)識,一個(gè)重要的商業(yè)應(yīng)用對象,例如一個(gè)Customer或者一個(gè)SKU,有一個(gè)或者更多的屬性---id,name,email地址,這樣可以把它從同一個(gè)類的其他實(shí)例區(qū)分開

      創(chuàng)建工廠來簡化對象的創(chuàng)建過程

      讓我們?yōu)镃olor類增加一個(gè)工廠,使得建立新的實(shí)例更簡單。增加一個(gè)可以命名顏色的方法,這樣就可以不記顏色數(shù)值,只需要記住自己喜歡的顏色名字。

      工廠對象或函數(shù)不一定都要被命名為 “工廠”。 當(dāng)你讀代碼時(shí),工廠是顯而易見的。 相反的,它的名字最好取得有意義,這樣可以反映出它解決了什么問題。

      在這個(gè)代碼例子中, 我要叫它CrayonBox顏色工廠。靜態(tài)的方法CrayonBox::getColor()引入命名顏色的字符串后,返回一個(gè)帶有相應(yīng)顏色屬性的Color類。

      下面的例子就可以測試這一點(diǎn):

      function TestGetColor() {
      $this->assertIsA($o =& CrayonBox::getColor(‘red’), ‘Color’);
      $this->assertEqual(‘#FF0000’, $o->getRgb());
      $this->assertIsA($o =& CrayonBox::getColor(‘LIME’), ‘Color’);
      $this->assertEqual(‘#00FF00’, $o->getRgb());
      }

      通過這個(gè)測試,我們發(fā)現(xiàn)每個(gè)返回的對象都是一個(gè)實(shí)例化的Color類,getRgb() 方法也返回了正確的結(jié)果。第一種情況是以“red”都是小寫測試,第二種情況是以“LIME”都是大寫測試,這樣可以測試代碼的通用性。

      保險(xiǎn)起見, 我們再對其進(jìn)行另外的測試,探究那些不合法的邊界情況。TestBadColor() 方法的作用是:用一個(gè)不存在的顏色名字引發(fā)一個(gè)包含這個(gè)顏色名字的php錯(cuò)誤,并返回黑色。

      function TestBadColor() {
      $this->assertIsA($o =& CrayonBox::getColor(‘Lemon’), ‘Color’);
      $this->assertErrorPattern(‘/lemon/i’);
      // got black instead
      $this->assertEqual(‘#000000’, $o->getRgb());
      }

      以下是一個(gè)可以滿足測試的CrayonBox類:

      class CrayonBox {
      /**
      * Return valid colors as color name => array(red, green, blue)
      *
      * Note the array is returned from function call
      * because we want to have getColor able to be called statically
      * so we can’t have instance variables to store the array
      * @return array
      */
      function colorList() {
      return array(
      ‘black’ => array(0, 0, 0)
      ,’green’ => array(0, 128, 0)
      // the rest of the colors ...
      ,’aqua’ => array(0, 255, 255)
      );
      }
      /**
      * Factory method to return a Color
      * @param string $color_name the name of the desired color
      * @return Color
      */
      function &getColor($color_name) {
      $color_name = strtolower($color_name);
      if (array_key_exists($color_name,
      $colors = CrayonBox::colorList())) {
      $color = $colors[$color_name];
      return new Color($color[0], $color[1], $color[2]);
      }
      trigger_error(“No color ‘$color_name’ available”);
      // default to black
      return new Color;
      }

      這顯然地是一個(gè)非常簡單的工廠, 它確實(shí)制造了單一化的對象(使用了顏色名字,而不是RGB數(shù)值) ,它展示了在新的對象被調(diào)用之前,是如何建立一個(gè)內(nèi)部對象的。

      分享:《PHP設(shè)計(jì)模式介紹》第一章 編程慣用法
      學(xué)習(xí)一門新的語言意味著要采用新的慣用法。這章將介紹或者可能重新強(qiáng)調(diào)一些慣用法。你會(huì)發(fā)現(xiàn)這些慣用法在你要在代碼中實(shí)現(xiàn)設(shè)計(jì)模式時(shí)候是非常有用的。 在這里總結(jié)的許多編程慣用法都是很值得

      來源:模板無憂//所屬分類:PHP教程/更新時(shí)間:2008-08-22
      相關(guān)PHP教程