1. 程式人生 > >設計模式學習筆記(開篇)-抽象工廠 工廠模式 簡單工廠(2)

設計模式學習筆記(開篇)-抽象工廠 工廠模式 簡單工廠(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。

好的,現在解決工具使用和開發的問提。現在要想想,工具的製造問題,常說中國製造,美國製造。 假如我們要製造一個把剪刀,需要選擇製造剪刀工藝(大小,外形等),指定剪刀材料(不鏽鋼,鋁合金等),剪刀把手的顏色(紅,黑,綠)等。 
那麼我們怎麼實現不同國家制造剪刀流程。難道要把剪刀的製造工藝,材料,和把手顏色的全部放在一個工廠中實現。者顯然不對。

這個問題,我們在下篇文章中解決。