?????????假設有一個音樂盒工廠,購買音樂盒的顧客不知道音樂盒是如何制作的,他只要知道如何播放音樂盒就可以了,以UML類圖來表示以上概念.
?????????如圖上所示,MusicBoxDemo代表了客戶的角色,它只依賴于IMusicBox界面,而不關心是如何實現的.如何產生IMusicBox由MusicBoxFactory完成.以一個簡單的程序來實現上面這個UML類圖:
- IMusicBox.java
public interface IMusicBox {
public void play();
}
- PianoBox.java
public class PianoBox implements IMusicBox {
public void play() {
System.out.println("播放鋼琴音樂:)");
}
}
- ViolinBox.java
public class ViolinBox implements IMusicBox {
public void play() {
System.out.println("播放小提琴音樂^_^");
}
}
- MusicBoxFactory.java
public class MusicBoxFactory {
public static IMusicBox createMusicBox(String name)
throws InstantiationException,
IllegalAccessException,
ClassNotFoundException {
// 這邊使用的是Java的Reflection機制來產生實例
// 不過客戶端不用管啦
// 以后就算改變了這邊的程序,客戶端程序是不用更改的
return (IMusicBox) Class.forName(name).newInstance();
}
}
- MusicBoxDemo.java
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();
}
}
由于客戶端只依賴與IMusicBox介面,所以即使您日后改變了createMusicBox()中的實現方式,對客戶端是一點影響也沒有的.
來看看Simple Factory的類結構:
客戶只要面對Factory,客戶依賴于產品介面,產品的具體實現是可以與客戶隔開的,它們也是可以抽換的.