創(chuàng)建工廠來簡化對象的創(chuàng)建過程
讓我們?yōu)镃olor類增加一個工廠,使得建立新的實例更簡單。增加一個可以命名顏色的方法,這樣就可以不記顏色數(shù)值,只需要記住自己喜歡的顏色名字。
工廠對象或函數(shù)不一定都要被命名為 “工廠”。 當你讀代碼時,工廠是顯而易見的。 相反的,它的名字最好取得有意義,這樣可以反映出它解決了什么問題。
在這個代碼例子中, 我要叫它CrayonBox顏色工廠。靜態(tài)的方法CrayonBox::getColor()引入命名顏色的字符串后,返回一個帶有相應顏色屬性的Color類。
下面的例子就可以測試這一點:
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()); }
通過這個測試,我們發(fā)現(xiàn)每個返回的對象都是一個實例化的Color類,getRgb() 方法也返回了正確的結果。第一種情況是以“red”都是小寫測試,第二種情況是以“LIME”都是大寫測試,這樣可以測試代碼的通用性。
保險起見, 我們再對其進行另外的測試,探究那些不合法的邊界情況。TestBadColor() 方法的作用是:用一個不存在的顏色名字引發(fā)一個包含這個顏色名字的php錯誤,并返回黑色。
function TestBadColor() { $this->assertIsA($o =& CrayonBox::getColor(‘Lemon’), ‘Color’); $this->assertErrorPattern(‘/lemon/i’); // got black instead $this->assertEqual(‘#000000’, $o->getRgb()); }
以下是一個可以滿足測試的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; }
這顯然地是一個非常簡單的工廠, 它確實制造了單一化的對象(使用了顏色名字,而不是RGB數(shù)值) ,它展示了在新的對象被調用之前,是如何建立一個內部對象的。
出處:
責任編輯:bluehearts
上一頁 php設計模式介紹之工廠模式 [4] 下一頁 php設計模式介紹之工廠模式 [6]
◎進入論壇網絡編程版塊參加討論
|