公司最近專案不忙,午間小憩之後,小二找到c哥攀談了起來。
"c哥,忙啥呢?"
"也沒忙啥,就是隨便看看。"
"哦哦,我最近也不怎麼忙。你上次給我講的工廠模式,受益匪淺啊!"
"哈哈,是嘛!其實你不知道,還有抽象工廠模式呢!"
"抽象工廠模式?願聞其詳。"
"好,反正最近也不忙,就給你講講吧。"
"小二,你知道,奧迪a4與a6,他們使用的輪胎與燈泡是不一樣的。"
"是,型號不一樣,輪胎與燈泡肯定不一樣。"
"假設現在需要製造a4與a6的輪胎和燈泡,你會怎麼寫**?"
"這個嘛,好寫!"
小二熟練的開啟電腦,揮斥方遒,迅速的寫出了**。
<?php
class client
$obj->produce_wheel();
}//根據不同型號生產不同燈泡
public function produce_light($type)
$obj->produce_light();
}}$client=new client();
$client->produce_wheel('a4');
$client->produce_light('a4');
"c哥,大體就是這麼個思路。您看看對嗎?"
"嗯,這**確實也實現了功能,但是,有問題。"
"有問題?什麼問題?"
"你這**存在著低內聚、高耦合的問題,不好維護啊。"
"怎麼低內聚、高耦合了?"小二一臉茫然。
c哥不慌不忙的解釋道:
比如,現在我要增加奧迪的型號a8,那你**裡的函式produce_wheel()
與produce_light()
是不是都要改?也就是這兩個函式是相互依賴的,不可能用a6的輪子,而用a8的燈泡。相互依賴,是為高耦合。
produce_wheel()
與produce_light()
函式,這兩個函式都關心自己需要什麼型號的產品,並且都負責把相應的產品生產出來。也就是,他有兩個職責:關心型號、根據不同型號生產出對應的產品。但這兩個職責是毫無關聯的,沒有半毛錢的關係。職責過多且分散,是為低內聚。
"c哥這麼一說,還真是這麼回事。"
"哈哈,低內聚高耦合的**也能實現需求,但是這樣的**不好維護。"
"嗯嗯,c哥,有啥好辦法嗎?"
"當然有了,我們這裡就用到了抽象工廠模式。"
"根據我多年的經驗,出現switch語句的地方,往往意味著需要抽象、或者存在著放錯責任的地方。"
"寶貴的經驗,記下了!"
"小二,其實這裡,就是放錯了責任。"
"嗯,怎麼說呢?"
"client端既關心如何建立物件,又關心如何用物件來製造輪子、燈泡。"
"是,他的責任太多了。"
"其實,client端只負責使用物件製造相關產品就行了。他不用負責創造物件。創造物件,交給client端來做,就是放錯了責任。"
"對,確實是這樣。"
"還記得前幾天給你講的工廠模式嗎?工廠模式也是為了解決這個問題。"
"記得記得,工廠模式也是為了實現責任的分離。"
"工廠模式針對一種產品提供乙個工廠類,而抽象工廠模式是針對一組相關或相互依賴的產品提供乙個工廠類。"
"那抽象工廠模式就是工廠模式的公升級版本啦!"
"是的。在這裡,client端負責向factory發出請求,factory返回相關物件,client端再根據factory返回的物件,製造相關的產品。"
"也就是client負責使用物件,factory負責建立物件!"
"是的,小二很聰明嘛!看看抽象工廠模式的類圖吧!"
"好的,c哥。"
"小二啊,跟你講了這麼多,接下來就看你了!"
"好的c哥,我馬上畫出類圖、寫出**。"
小二仿照著c哥的類圖,又畫出了用抽象工廠解決上面問題的類圖。
畫好類圖,**也就好寫了!
<?php
//燈泡產品介面
inte***ce light
//奧迪a4燈泡產品
class audia4light implements light
}//奧迪a6燈泡產品
class audia6light implements light
}//輪子產品介面
inte***ce wheel
//奧迪a4輪子
class audia4wheel implements wheel
}//奧迪a6輪子
class audia6wheel implements wheel
}//工廠介面
inte***ce factory
//奧迪a4工廠
class a4factory implements factory
public function createlight()
}//奧迪a6工廠
class a6factory implements factory
public function createlight()
}//客戶端呼叫類
class client
//生產產品
public static function run(factory $factory)
}client::main('a6');
"嗯嗯,小二不錯嘛。簡單工廠、工廠方法、抽象工廠模式,你都掌握了。"
"哈哈,感謝c哥的教導!"
"恭喜你在設計模式打怪公升級的道路上,再次斬獲新技能!"
聽到這句話,小二心裡美滋滋的,嘴角露出了得意的微笑......
關注「聊聊**」,讓我們一起聊聊「左手**右手詩」的事兒。
設計模式系列 抽象工廠模式
如圖,factorya專心負責生產producta,factoryb專心負責生產productb,factorya和factoryb之間沒有關係 如果到了後期,如果需要生產productc時,我們則可以建立乙個factoryc工廠類,該類專心負責生產productc類產品。由於factorya fa...
設計模式系列 抽象工廠模式
抽象工廠模式為建立一組物件提供了一種解決方案。與工廠方法模式相比,抽象工廠模式中的具體工廠不只是建立一種產品,它負責建立一族產品。例如海爾電器工廠生產的海爾電視機 海爾電冰箱,海爾電器廠1生產電視機型別1和電冰箱型別1,海爾電器廠2生產電視機型別2和電冰箱型別2,這個時候就必須要用抽象工廠模式了,工...
設計模式系列 抽象工廠模式
抽象工廠是基於簡單工廠發展而來的,通過抽象工廠,我們可以建立多種型別的工廠,並且依據具體業務需求而在具體工廠裡面進行任意拼裝組合。在現實世界中,汽車製作行業有各種各樣的工廠,每個工廠都需要具有生產輪胎 汽車引擎等部件的能力,但是針對具體的工廠,每個部件的生產又各不相同,所有在軟體開發過程中,當我們為...