閱讀156 返回首頁    go 技術社區[雲棲]


Design Pattern: Simple Factory 模式

  學習是分享和合作式的!

轉載請注明出處:https://blog.csdn.net/wdzxl198/article/details/9219385

文章摘自: https://www.riabook.cn/doc/designpattern/;   

     Simple Factory模式(又稱Static Factory模式),一個Simple Factory生產成品,而對客戶端隱藏產品產生的細節。實作時定義一個產品介麵(interface),並透過特定靜態方法來建立成品。
假設有一個音樂盒工廠,購買音樂盒的客人不用知道音樂盒是如何製作的,他隻要知道如何播放音樂盒就可以了,以 UML 類別圖來表示以上的概念:

SimpleFactory

如上圖所示的,MusicBoxDemo代表了客戶的角色,它隻依賴於IMusicBox介麵,而不關心特定的實作,實際如何產生IMusicBox的實例由MusicBoxFactory完成,以一個簡單的程式來實現上麵這個UML類別圖:

  • IMusicBox.java
   1: public interface IMusicBox {
   2:     public void play();
   3: }
  • PianoBox.java
   1: public class PianoBox implements IMusicBox {
   2:     public void play() {
   3:         System.out.println("撥放鋼琴音樂:)");
   4:     }
   5: }
  • ViolinBox.java
   1: public class ViolinBox implements IMusicBox {
   2:     public void play() {
   3:         System.out.println("撥放小提琴音樂^_^");
   4:     }
   5: }
  • MusicBoxFactory.java
   1: public class MusicBoxFactory {
   2:     public static IMusicBox createMusicBox(String name) 
   3:                                throws InstantiationException, 
   4:                                       IllegalAccessException, 
   5:                                       ClassNotFoundException {
   6:         // 這邊使用的是Java的Reflection機製來產生實例
   7:         // 不過客戶端不用管啦
   8:         // 以後就算改變了這邊的程式,客戶端程式是不用更改的
   9:         return (IMusicBox) Class.forName(name).newInstance();
  10:     }
  11: }
  • MusicBoxDemo.java
   1: public class MusicBoxDemo {
   2:     public static void main(String[] args) throws Exception {
   3:         playMusicBox(MusicBoxFactory.createMusicBox("PianoBox"));
   4:         playMusicBox(MusicBoxFactory.createMusicBox("ViolinBox"));
   5:     }
   6:     
   7:     public static void playMusicBox(IMusicBox musicBox) {
   8:         musicBox.play();
   9:     }
  10: }
由於客戶端隻依賴於IMusicBox介麵,所以即使您日後改變了createMusicBox()中的實作方式,對客戶端是一點影響也沒有的。
來看看Simple Factory的類別結構:

SimpleFactory

客戶隻要麵對Factory,客戶依賴於產品介麵,產品的具體實作是可以與客戶隔開的,它們也是可以抽換的。

Edit bt Atlas

Time 2013/6/30 21:21

最後更新:2017-04-03 16:59:48

  上一篇:go 雷政富:你的長相嚇著我了
  下一篇:go lifetype