工廠模式是Java常用的設計模式之一,屬於創建型模式,在平常開發中是很常見的。主要是用在複雜對象的實例化中,通過工廠模式對外屏蔽複雜的具體實現,達到解耦效果。
工廠模式細分爲簡單工廠模式,工廠模式,抽象工廠模式
閱讀本文,建議從頭到尾,因爲知識點由淺到深,看似簡單,精粹卻深藏其中,願讀者慢慢食用並消化之。
簡單工廠模式
在深圳的某個地方,有個工廠,生產機頂盒(STB),機頂盒的又分小米機頂盒和TCL機頂盒。由於機頂盒的生產過程是非常複雜的工藝,所以工廠對小米和TCL公司說,需要需要生產對應的機頂盒找我就好。
- 所以首先要有機頂盒這個概念,所以我們抽象出機頂盒接口,使其作爲小米機頂盒、TCL機頂盒的父類。該機頂盒功能我們暫時定義是否支持帶USB口,是否支持杜比,播放視頻。現實機頂盒是比較複雜的,這裏舉例說明簡單點。
public interface STB {
/**
* 是否帶USB接口
* @return true,帶USB接口,false,不帶USB接口
*/
boolean hasUSBInterface();
/**
* 是否支持杜比播放
* @return true,表示支持,false,表示不支持
*/
boolean supportDolby();
/**
* 播放視頻
*/
void playVideo();
}
- 接下來,小米機頂盒和TCL機頂盒的具體實現,根據自身的定製,支持的功能。
小米機頂盒具體實現類
public class XiaoMiSTB implements STB {
@Override
public boolean hasUSBInterface() {
return true;
}
@Override
public boolean supportDolby() {
return false;
}
@Override
public void playVideo() {
System.out.println("我是小米機頂盒,正在播放視頻");
}
}
TCL機頂盒具體實現類
public class TCLSTB implements STB {
@Override
public void playVideo() {
System.out.println("我是TCL機頂盒,正在播放視頻");
}
@Override
public boolean hasUSBInterface() {
return false;
}
@Override
public boolean supportDolby() {
return false;
}
}
- 有了盒子,那麼那就需要工廠來生產了,所以我們造一座工廠出來,負責生產小米和TCL機頂盒。
public class STBFactory {
public final static String XIAO_MI = "xiaomi";
public final static String TCL = "tcl";
public STB getSTB(String stbType) {
switch (stbType) {
case XIAO_MI:
return new XiaoMiSTB();
case TCL:
return new TCLSTB();
default:
return null;
}
}
}
- 小米和TCL公司來訂單了,要工廠生產自己家公司的機頂盒,用來播放視頻。
public class SimpleFactory {
public static void main(String[] args) {
//穿建工廠實例
STBFactory stbFactory = new STBFactory();
//通知工廠,生產小米機頂盒,獲取小米機頂盒實例
STB xiaomiSTB = stbFactory.getSTB(STBFactory.XIAO_MI);
//小米機頂盒播放視頻
xiaomiSTB.playVideo();
//通知工廠,生產TCL機頂盒,獲取TCL機頂盒實例
STB tclSTB = stbFactory.getSTB(STBFactory.TCL);
//TCL機頂盒播放視頻
tclSTB.playVideo();
}
}
5 用戶已經在家裏看視頻了,生產成功了,機頂盒可正常使用。
工廠模式
隨着工廠規模的擴大,機頂盒工廠分設兩個子工廠,分別用於生產對應小米機頂盒和TCL機頂盒。生產機頂盒的牌子由子工廠決定,不再需要機頂盒工廠通過下發命令(參數)來控制。這裏主要也是涉及到Java多態特性。
1 爲此,我們需要重新調整機頂盒的業務,即代碼內容,我們將機頂盒工廠抽象爲一個接口,不在具體管理生產,由子工廠管理生產。
public interface STBFactroy {
/**
* 生產機頂盒,獲取機頂盒實例
* @return
*/
STB getSTB();
}
- 造兩座子工廠,分別爲小米工廠和TCL工廠。
小米工廠
public class XiaoMiFactory implements STBFactroy {
@Override
public STB getSTB() {
return new XiaoMiSTB();
}
}
TCL工廠
public class TCLFactory implements STBFactroy {
@Override
public STB getSTB() {
return new TCLSTB();
}
}
- 工廠業務員真棒,子工廠剛建立,立馬就收到TCL公司的新訂單,並生產了盒子,播放視頻正常。
public class Factory {
public static void main(String[] args) {
STBFactroy stbFactroy=new TCLFactory();
STB stb=stbFactroy.getSTB();
stb.playVideo();
}
}
抽象工廠模式
在工廠業務日益繁榮的情況下,工廠決定增設手機業務,主要生產小米手機和TCL手機。此時,工廠從一個機頂盒產品變成兩個兩個產品,機頂盒和手機。相對應的工廠模式也變成了抽象工廠模式。在此,可以看到,只有一個產品,是工廠模式,兩個產品,就是抽象工廠模式。
- 定義手機概念,抽象一個Phone接口,具有撥打電話和版本信息。
public interface Phone {
/**
* 撥打電話
*/
void call();
/**
* 系統信息
*/
void build();
}
- 手機的具體牌子,實現類。
小米手機
public class XiaoMiPhone implements Phone {
@Override
public void call() {
System.out.println("小米手機正在撥打電話");
}
@Override
public void build() {
System.out.println("我是小米手機");
}
}
TCL手機
public class TCLPhone implements Phone {
@Override
public void call() {
System.out.println("TCL手機正在撥打電話");
}
@Override
public void build() {
System.out.println("我是TCL手機");
}
}
- 爲總工廠添加生產手機業務,子工廠具體負責實現。
父類工廠接口,抽象子工廠的業務
public interface HeadFactory {
/**
* 生產機頂盒,獲取機頂盒實例
* @return
*/
STB getSTB();
/**
* 生產手機,獲取手機實例
* @return
*/
Phone getPhone();
}
小米工廠實現類
public class XiaoMiFactory implements HeadFactory {
@Override
public STB getSTB() {
return new XiaoMiSTB();
}
@Override
public Phone getPhone() {
return new XiaoMiPhone();
}
}
TCL工廠實現類
public class TCLFactory implements HeadFactory {
@Override
public STB getSTB() {
return new TCLSTB();
}
@Override
public Phone getPhone() {
return new TCLPhone();
}
}
- 工廠已經建立完畢,是時候接單進行生產了,在保持舊業務的持續發展下,接來了TCL的手機新訂單。
public class Factory {
public static void main(String[] args) {
HeadFactory stbFactory =new XiaoMiFactory();
STB stb= stbFactory.getSTB();
stb.playVideo();
Phone phone=stbFactory.getPhone();
phone.build();
}
}
-
小米手機看來使用正常
到此,設計模式中的工廠模式就介紹完畢了,下面進行總結一下。
- 如果類比較簡單,新建一個對象,採用工廠模式是得不償失的,通過上面的例子,創建一個簡單的對象,可能需要創建很多的類。工廠模式適合在明確條件下,有多少對象,有多少分支,建立對象比較複雜的情況下去選擇。
- 工廠模式的初心是解耦,所以別了使用工廠模式,而更加耦合。
- 簡單工廠模式,工廠模式,抽象工廠模式都是相互關聯的。工廠模式相對於簡單工廠模式,只是讓實現類去生成對象,而不是根據條件去判斷。抽象工廠模式相對於工廠模式,只是對象的多少問題。