設計模式學習筆記(開篇)-抽象工廠 工廠模式 簡單工廠(2)
繼續上篇 設計模式學習筆記(開篇)-抽象工廠 工廠模式 簡單工廠(1) 繼續說。
上篇講到了簡單工廠模式。簡述了它的實現、作用、優點、缺點。同時留下了一個問題。在SimpleFactory這個工廠類中,簡單的實現工具的選擇是不復雜的,但是當我們加入的產地選擇的適合,SimpleFactory的程式碼量幾乎成倍增長,會出現大量的if else。這對於SimpleFactory的維護者(開發者)來說,這是一件非常難受的事,同時,加入的產地的選擇,會改變原有的介面模式。可能造成之前的使用者不不得不修改原有的程式碼,以適應你的修改。對使用者來說,也是件不爽的事情。
因為簡單工廠的擴充套件性不好,不適合複雜的物件建立。要怎麼解決上面的問題
當然我們可以為不同產地的建立不同的簡單工廠,讓使用者自行選擇要使用哪個工廠。這是一個好的解決方法,這樣使用者就不需要改變原來的介面。當需要不同產地時,只需要選擇不同產地的工廠就好了。但是也有個問題。如果不同產地的工廠是不同的開發者,他們定義了各種各樣的介面 比如A開發者 定義 CreateToolA,B開發者定義CreateToolB。那這樣使用者就需要記憶很多介面。這也不利於使用者。所以,對於介面的開發者,我們是否可以定義一種開發框架。讓所有開發者按照這個框架進行建立介面工廠。
順著這個思路,我們首先建立一個介面開發框架:
interface ITool{} public function createTool($flag); }
然後中國開發者開發中國的工廠模式
//中國工具建立 class ChinaTool implements ITool { public function createTool($flag) { if($flag == 'SmallHammer') { return new SmallHammer(); } else if($flag == 'BigHammer') { return new BigHammer() } else if($flag == 'StraightScrewdriver') { return new StraightScrewdriver() } else if($flag == 'CrossScrewdriver') { return new CrossScrewdriver(); } return null; } }
美國開發者開發美國的工廠模式
class AmericaTool implements ITool {
public function createTool($flag) {
if($flag == 'SmallHammer') {
return new AmericaSmallHammer();
}
else if($flag == 'BigHammer') {
return new AmericaBigHammer()
}
else if($flag == 'StraightScrewdriver') {
return new AmericaStraightScrewdriver()
}
else if($flag == 'CrossScrewdriver') {
return new AmericaCrossScrewdriver();
}
return null;
}
}
使用者要使用不同的工廠方法。
//讓使用者只依賴於ITool這個介面,而不依賴具體的工具工廠
class UseTool {
private $tools = null
public function __construct(ITool $tools) {
$this->$tools = $tools
}
public createTool($flag) {
$this->tools->createTool($flag);
}
}
//中國工具的使用
$ChinaTool = new ChinaTool();
$UseTool = new UseTool($ChinaTool);
$UseTool->createTool("SmallHammer");
//美國工具的使用
$AmericaTool = new AmericaTool();
$UseTool = new UseTool($ChinaTool);
$UseTool->createTool("SmallHammer");
你看,上面的實現過程是不是解決了設計模式學習筆記(開篇)-抽象工廠 工廠模式 簡單工廠(1) 中當增加產地時需要維護大量了if else 的邏輯。對於擴充套件,只需簡單繼承ITool這個類,然後實現具體程式碼即可。這非常符合OCP(開放-關閉原則)。同時UseTool 只需要依賴ITool,不依賴具體的工廠實現,這就解耦了。
好了總結一下,其實上面的實現方式就是工廠模式的實現流程。
工廠模式主要是建立一個框架,讓子類決定如何實現。這種開發具有彈性且擴充套件簡單,符合OCP。
好的,現在解決工具使用和開發的問提。現在要想想,工具的製造問題,常說中國製造,美國製造。 假如我們要製造一個把剪刀,需要選擇製造剪刀工藝(大小,外形等),指定剪刀材料(不鏽鋼,鋁合金等),剪刀把手的顏色(紅,黑,綠)等。
那麼我們怎麼實現不同國家制造剪刀流程。難道要把剪刀的製造工藝,材料,和把手顏色的全部放在一個工廠中實現。者顯然不對。
這個問題,我們在下篇文章中解決。