Never give up!

          如果說軟件開發是一條布滿荊棘的坎坷之路,那么我會每天在這道路兩旁書上“火焰舞者,到此一游!”。

           

          工廠方法模式

          工廠模式相當于創建實例對象的new,我們經常要根據類Class生成實例對象,如A a=new A() 。工廠模式也是用來創建實例對象的,所以new時就要多個心眼,是否可以考慮實用工廠模式,雖然這樣做,可能多做一些工作,但會給你系統帶來更大的可擴展性和盡量少的修改量。設想一個場景:一個肉鋪老板賣肉,因為剛開張生意冷清,也就先賣下豬肉吧。
          類圖如下:

          原先我們可能會在客戶端直接調用比如Pig asiaPig = new AsiaPig()之類的代碼,但現在我們只需調用PigFactory.createPig(***)來達到對Pig實現類的創建,這樣客戶端程序中超類的代碼和子類對象的創建代碼解藕了。
          public class PigFactory {

              @SuppressWarnings(
          "unchecked")
              
          public static Pig createPig(String pigName) {
                  
          if ("AsiaPig".equals(pigName)) {
                      
          return new AsiaPig();
                  } 
          else if ("AfricanPig".equals(pigName)) {
                      
          return new AfricanPig();
                  } 
          else {
                      
          return null;
                  }
              }
          }

          public class PorkStore {

              
          private static void sendPork(String pigName) {
                  Pig africanPig 
          = PigFactory.createPig(pigName);
                  africanPig.send();
                  
              }
              
               
          public static void main(String[] args) {
                   sendPork(
          "AsiaPig");
                   sendPork(
          "AfricanPig");
              }
          }

          這樣做的另一個問題又出來了,隨著if else的增多代碼塊變的越趨龐大,這時就可利用java的發射來進行改善了,調整如下:
          package factoryMethod;

          public class PigFactory {

              @SuppressWarnings(
          "unchecked")
              
          public static Pig createPig(String pigNme) {
                  
          try {
                      Class animalClass 
          = Class.forName(pigNme);
                      
                      
          return (Pig)animalClass.newInstance();
                  } 
          catch (ClassNotFoundException e) {
                      
          throw new RuntimeException("caught exception while found the class", e);
                  } 
          catch (InstantiationException e) {
                      
          throw new RuntimeException("caught exception while instantiation", e);
                  } 
          catch (IllegalAccessException e) {
                      
          throw new RuntimeException(e);
                  }
              }
          }

          public class PorkStore {

              
          private static void sendPork(String pigName) {
                  Pig africanPig 
          = PigFactory.createPig(pigName);
                  africanPig.send();
                  
              }
              
               
          public static void main(String[] args) {
                   sendPork(
          "factoryMethod.AsiaPig");
                   sendPork(
          "factoryMethod.AfricanPig");
              }
          }

          共廠方法模式定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個,讓類把實例化推遲到子類

          posted on 2009-02-28 07:38 永遠的火焰舞者 閱讀(196) 評論(0)  編輯  收藏 所屬分類: designing pattern


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類(10)

          隨筆檔案(9)

          文章檔案(1)

          搜索

          最新評論

          • 1.?re: JForum安裝
          • 我就是想研究下sso,哈哈!再在JForum的基礎上二次開發玩玩 呵呵
          • --Jlg
          • 2.?re: JForum安裝
          • JForum的代碼還比較清晰,但談不上強大,雖然一般也足夠用了。
          • --一農

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西昌市| 姚安县| 竹山县| 桑日县| 弥勒县| 苍山县| 凌源市| 黎平县| 方正县| 莱州市| 嘉黎县| 松江区| 驻马店市| 新丰县| 屏山县| 且末县| 会昌县| 上蔡县| 滨州市| 南丹县| 高青县| 莆田市| 博兴县| 柳林县| 遵化市| 霍城县| 布拖县| 菏泽市| 通辽市| 金堂县| 沅陵县| 盐池县| 苍溪县| 铜山县| 南郑县| 秦皇岛市| 永川市| 许昌县| 德庆县| 房产| 新密市|