大白話簡單工廠模式 (Simple Factory Pattern) 從買車經歷說起 畢業兩年,碼農張小兩口無法忍受擠公交,凌晨起床搶火車票的痛苦,遂計劃買車。逛了多家4S店,最終定下日產某車型的轎車。4S店接受訂單後,向工廠說明車型,工廠隨後進行汽車製造,運輸到4S店中再到了小兩口的手上,小兩口終 ...
大白話簡單工廠模式 (Simple Factory Pattern)
從買車經歷說起
畢業兩年,碼農張小兩口無法忍受擠公交,凌晨起床搶火車票的痛苦,遂計劃買車。逛了多家4S店,最終定下日產某車型的轎車。4S店接受訂單後,向工廠說明車型,工廠隨後進行汽車製造,運輸到4S店中再到了小兩口的手上,小兩口終於成了有車一族。
仔細分析,4S銷售模式即為典型的簡單工廠模式。下麵從代碼的角度進行分析。
無工廠模式
首先,我們先分析4S店最初的模式(企業個人作坊階段,無工廠)。4S店賣車首先要有車,這裡只取日產部分車型逍客,軒逸和天籟。
代碼片段1 日產車父類,所有車型都繼承此類。
/**
* 日產車
* @author coderzcr
*/
abstract class NissanCar {
String name;
void printCar(){
System.out.println(name+"汽車已製造完成");
}
}
代碼片段2 車型:逍客
/**
* 車型:逍客
* @author coderzcr
*/
class Xtrail extends NissanCar {
Xtrail(){
this.name = "逍客";
}
}
代碼片段3 車型:軒逸
/**
* 車型:軒逸
* @author coderzcr
*/
class Sylphy extends NissanCar {
Sylphy(){
this.name = "軒逸";
}
}
代碼片段4 車型:天籟
/**
* 車型:天籟
* @author coderzcr
*/
class Altima extends NissanCar {
Altima(){
this.name="天籟";
}
}
代碼片段5 無工廠的4S店
/**
* 4s店
* @author coderzcr
*/
class FourS {
/**
* 獲取汽車
* @param type 汽車型號
*/
void getCar(String type) {
NissanCar nissanCar = null;
if ("1".equals(type)) {
nissanCar = new Xtrail();
} else if ("2".equals(type)) {
nissanCar = new Sylphy();
} else if ("3".equals(type)) {
nissanCar = new Altima();
}
assert nissanCar != null;
nissanCar.printCar();
}
}
圖片1 無工廠模式類圖
由上圖可以發現
- 4S店職責過多,不僅需要銷售,還需要製造汽車,明白如何生產某型號的汽車。
- 耦合嚴重,如果需要發佈新的車型,還需要對4S進行修改(即學習更多的車型製造),無疑增大了4S店的壓力。
隨著企業的發展,企業認識到了問題的嚴重性,開始設立工廠。工廠負責製造汽車,4S店負責銷售汽車,只需告知工廠型號即可獲取汽車。
代碼片段6 汽車工廠
/**
* 日產車工廠
* @author coderzcr
*/
public class NissanCarFactory {
/**
* 生產汽車
* @param type 汽車型號
*/
NissanCar createCar(String type) {
NissanCar nissanCar = null;
if ("1".equals(type)) {
nissanCar = new Xtrail();
} else if ("2".equals(type)) {
nissanCar = new Sylphy();
} else if ("3".equals(type)) {
nissanCar = new Altima();
}
return nissanCar;
}
}
代碼片段7 有工廠的4S店。
/**
* 有工廠的4S店。
*
* @author coderzcr
*/
class FourS {
NissanCarFactory nissanCarFactory;
FourS(NissanCarFactory nissanCarFactory) {
this.nissanCarFactory = nissanCarFactory;
}
/**
* 獲取汽車
*
* @param type 汽車型號
*/
void getCar(String type) {
NissanCar nissanCar = nissanCarFactory.createCar(type);
nissanCar.printCar();
}
}
圖片2 有工廠模式類圖
經過改造,4S店和工廠的職責進行了分離,減輕了4S店的壓力。當發佈新車型時,只需瞭解其型號告知工廠即可獲取到相應車輛。
簡單工廠模式定義
簡單工廠模式(Simple Factory Pattern):屬於類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
已上面舉例來解釋的話就是根據車型的不同製造不同型號的車。日產專門建造一個工廠來負責製造汽車,被創造的汽車都是日產車型。
簡單工廠模式結構
簡單工廠模式包含如下角色:
- Factory:工廠角色
工廠角色負責實現創建所有實例的內部邏輯。例子中得日產工廠(NissanFactory) - Product:抽象產品角色
抽象產品角色是所創建的所有對象的父類,負責描述所有實例所共有的公共介面。例子中的日車車(NissanCar) - ConcreteProduct:具體產品角色
具體產品角色是創建目標,所有創建的對象都充當這個角色的某個具體類的實例。例子中的逍客,軒逸,天籟。(Xtrail、Sylphy、Altima)
圖片3 簡單工廠模式
簡單工廠模式分析
將對象的創建和對象本身業務處理分離可以降低系統的耦合度,使得兩者修改起來都相對容易。
簡單工廠模式最大的問題在於工廠類的職責相對過重,增加新的產品需要修改工廠類的判斷邏輯,這一點與開閉原則是相違背的。
簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。
參考文獻
1. 簡單工廠模式( Simple Factory Pattern ) — Graphic Design Patterns