Simple Factory模式(又稱(chēng)Static Factory模式),一個(gè)Simple Factory生產(chǎn)成品,而對(duì)客戶(hù)端隱藏產(chǎn)品產(chǎn)生的細(xì)節(jié)。實(shí)作時(shí)定義一個(gè)產(chǎn)品介面(interface),並透過(guò)特定靜態(tài)方法來(lái)建立成品。
假設(shè)有一個(gè)音樂(lè)盒工廠(chǎng),購(gòu)買(mǎi)音樂(lè)盒的客人不用知道音樂(lè)盒是如何製作的,他只要知道如何播放音樂(lè)盒就可以了,以 UML 類(lèi)別圖來(lái)表示以上的概念:
如上圖所示的,MusicBoxDemo代表了客戶(hù)的角色,它只依賴(lài)於IMusicBox介面,而不關(guān)心特定的實(shí)作,實(shí)際如何產(chǎn)生IMusicBox的實(shí)例由MusicBoxFactory完成,以一個(gè)簡(jiǎn)單的程式來(lái)實(shí)現(xiàn)上面這個(gè)UML類(lèi)別圖:
public interface IMusicBox {
public void play();
}
public class PianoBox implements IMusicBox {
public void play() {
System.out.println("撥放鋼琴音樂(lè):)");
}
}
public class ViolinBox implements IMusicBox {
public void play() {
System.out.println("撥放小提琴音樂(lè)^_^");
}
}
public class MusicBoxFactory {
public static IMusicBox createMusicBox(String name)
throws InstantiationException,
IllegalAccessException,
ClassNotFoundException {
// 這邊使用的是Java的Reflection機(jī)制來(lái)產(chǎn)生實(shí)例
// 不過(guò)客戶(hù)端不用管啦
// 以後就算改變了這邊的程式,客戶(hù)端程式是不用更改的
return (IMusicBox) Class.forName(name).newInstance();
}
}
public class MusicBoxDemo {
public static void main(String[] args) throws Exception {
playMusicBox(MusicBoxFactory.createMusicBox("PianoBox"));
playMusicBox(MusicBoxFactory.createMusicBox("ViolinBox"));
}
public static void playMusicBox(IMusicBox musicBox) {
musicBox.play();
}
}
由於客戶(hù)端只依賴(lài)於IMusicBox介面,所以即使您日後改變了createMusicBox()中的實(shí)作方式,對(duì)客戶(hù)端是一點(diǎn)影響也沒(méi)有的。
來(lái)看看Simple Factory的類(lèi)別結(jié)構(gòu):
客戶(hù)只要面對(duì)Factory,客戶(hù)依賴(lài)於產(chǎn)品介面,產(chǎn)品的具體實(shí)作是可以與客戶(hù)隔開(kāi)的,它們也是可以抽換的。