設計模式系列 抽象工廠模式

2021-09-16 22:26:34 字數 2924 閱讀 8355

公司最近專案不忙,午間小憩之後,小二找到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,這個時候就必須要用抽象工廠模式了,工...

設計模式系列 抽象工廠模式

抽象工廠是基於簡單工廠發展而來的,通過抽象工廠,我們可以建立多種型別的工廠,並且依據具體業務需求而在具體工廠裡面進行任意拼裝組合。在現實世界中,汽車製作行業有各種各樣的工廠,每個工廠都需要具有生產輪胎 汽車引擎等部件的能力,但是針對具體的工廠,每個部件的生產又各不相同,所有在軟體開發過程中,當我們為...