日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

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

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

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

別把話題扯遠(yuǎn)了。那么如何才在黑匣子和白匣子之間找到折中辦法來實(shí)現(xiàn)TDD呢呢?一種選擇就是使原來的類中的私有方法變?yōu)楣�,并且在發(fā)布的時(shí)候變回私有。但這并不是十分令人滿意的方式,所以我們建立一個(gè)子類,同時(shí)使子類中的方法可以從外部訪問:

下面就是一個(gè)子類的例子:

class TestableAssessor extends Assessor {
public function getPropInfo($name) {
return Assessor::getPropInfo($name);
}
}

這樣做的好處是你可以得到正確的Assessor公有接口(API), 但通過 TestableAssessor 類我們就可以來測試Assessor類了。另外, 你用于測試的代碼也不會(huì)影響到Assessor類。

缺點(diǎn)是:外加的類會(huì)帶來更多的問題,從而使測試變得更復(fù)雜。而且如果你在對(duì)象中的一些內(nèi)部接口作出一些改動(dòng), 你的測試將隨著你的重構(gòu)而再次失效。

比較了它的優(yōu)點(diǎn)和缺點(diǎn),讓我們來看看它的測試方法:

function testGetPropInfoReturn() {
$assessor = new TestableAssessor;
$this->assertIsA(
$assessor->getPropInfo(‘Boardwalk’), ‘PropertyInfo’);
}

為了要保證所有代碼的正確執(zhí)行, 我們可以使用異常處理。 SimpleTest的目前是基于PHP4 搭建的測試的結(jié)構(gòu),所以不具備異常處理能力。但是你還是可以在測試中使用如下。

function testBadPropNameReturnsException() {
$assessor = new TestableAssessor;
$exception_caught = false;
try { $assessor->getPropInfo(‘Main Street’); }
catch (InvalidPropertyNameException $e) {
$exception_caught = true;
}
$this->assertTrue($exception_caught);

最后, Assessor類的執(zhí)行部分完成了:

class Assessor {
protected $game;
public function setGame($game) { $this->game = $game; }
public function getProperty($name) {
$prop_info = $this->getPropInfo($name);
switch($prop_info->type) {
case ‘Street’:
$prop = new Street($this->game, $name, $prop_info->price);
$prop->color = $prop_info->color;
$prop->setRent($prop_info->rent);
return $prop;
case ‘RailRoad’:
return new RailRoad($this->game, $name, $prop_info->price);
break;
case ‘Utility’:
return new Utility($this->game, $name, $prop_info->price);
break;
default: //should not be able to get here
}
}
protected $prop_info = array(/* ... */);
protected function getPropInfo($name) {
if (!array_key_exists($name, $this->prop_info)) {
throw new InvalidPropertyNameException($name);
}
return new PropertyInfo($this->prop_info[$name]);
}
}

Assessor::getPropInfo()方法從邏輯上說明 PropertyInfo工廠類是作為了Assessor類的一個(gè)私有的方法。而Assessor::getProperty() 方法是用來返回三個(gè)Property子類的一個(gè),至于返回哪一個(gè)子類這要看property的名字。

遲加載(Lazy Loading)的工廠

使用工廠的另一個(gè)好處就是它具有遲加載的能力。這種情況常被用在:一個(gè)工廠中包括很多子類,這些子類被定義在單獨(dú)的PHP文件內(nèi)。

注:術(shù)語 - 遲加載
在遲加載模式中是不預(yù)加載所有的操作(像包含PHP文件或者執(zhí)行數(shù)據(jù)庫查詢語句),除非腳本中聲明要加載。

用一個(gè)腳本可以有效地控制多個(gè)網(wǎng)頁的輸出,這是Web常用的方法了。比如一個(gè)博客程序,一些入口就有不同的頁面來實(shí)現(xiàn),一個(gè)簡單的評(píng)論入口就有:發(fā)布評(píng)論的頁面,一個(gè)導(dǎo)航的頁面,一個(gè)管理員編輯的頁面等。 你可以把所有的功能放入一個(gè)單獨(dú)的類中,使用工廠來加載他們。每一個(gè)功能類可以單獨(dú)放在一個(gè)文件里,再把這些文件都放在“pages”這個(gè)子文件夾里,這樣可以方便調(diào)用。

實(shí)現(xiàn)遲加載的頁面工廠(page factory)的代碼可以寫作:

class PageFactory {
function &getPage() {
$page = (array_key_exists(‘page’, $_REQUEST))
? strtolower($_REQUEST[‘page’])
: ‘’;
switch ($page) {
case ‘entry’: $pageclass = ‘Detail’; break;
case ‘edit’: $pageclass = ‘Edit’; break;
case ‘comment’: $pageclass = ‘Comment’; break;
default:
$pageclass = ‘Index’;
}
if (!class_exists($pageclass)) {
require_once ‘pages/’.$pageclass.’.php’;
}
return new $pageclass;
}
}

你可以利用 PHP 的動(dòng)態(tài)加載性質(zhì),然后使用實(shí)時(shí)的運(yùn)行需求(run-time)來給你要建立的類命名。在這情況下, 根據(jù)一個(gè) HTTP 請(qǐng)求叁數(shù)就能確定哪個(gè)頁面被加載。你可以使用遲加載,這樣只要當(dāng)你需要建立新對(duì)象時(shí)才載入相應(yīng)的類,不需要你載入所有可能用到的“page”類。在上述例子中就用了 require_once來實(shí)現(xiàn)這一點(diǎn)。這個(gè)技術(shù)對(duì)于一個(gè)裝有PHP加速器的系統(tǒng)來說并不重要,因?yàn)榘粋(gè)外加的文件使用的時(shí)間對(duì)它來說可以忽略。 但對(duì)于大多數(shù)典型的PHP服務(wù)器來說,這樣做是很有好處的。

要想了解更多的關(guān)于遲加載的知識(shí),請(qǐng)看第 11 章-代理模式。

小節(jié)

工廠模式是非常簡單而且非常有用。如果你已經(jīng)有很多關(guān)于工廠模式的例子代碼,你會(huì)發(fā)現(xiàn)更多的東西�!禛oF》這本書就介紹了一些關(guān)于構(gòu)建的模式:AbstractFactory and Builder。 AbstractFactory用來處理一些相關(guān)組件,Builder模式則是使建立復(fù)雜對(duì)象更為容易。

在這章的多數(shù)例子里, 參數(shù)是通過工廠方法引入的(例如 CrayonBox::getColor(‘紅色’);)。《GoF》中則稱為“參數(shù)化工廠”(parameterized factory),它是PHP網(wǎng)頁設(shè)計(jì)中典型的工廠方法。

你現(xiàn)在已經(jīng)了解工廠模式了, 它是一種代碼中建立新對(duì)象的管理技術(shù)。 你可以看到工廠模式是可以把復(fù)雜對(duì)象的建立集中起來,甚至用不同的類代替不同的對(duì)象。最后,工廠模式支持OOP技術(shù)中的多態(tài)也是很重要的。

function TestGetRgbRed() {
$red =& new Color(255,0,0);
$this->assertEqual(‘#FF0000’, $red->getRgb());
}

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

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