使用Factory Method模式 (引用lhbdir )

          Posted on 2007-11-15 23:05 yukui 閱讀(102) 評論(0)  編輯  收藏 所屬分類: 技術
          A: Factory method(工廠方法)只不過是實例化對象的一種方法的名稱。就象工廠一樣,Factory method的任務是創建--或制造--對象。

          讓我們看一個例子。

          每個程序要有一種報錯的方式。看看下面的接口:代碼清單1
          public interface Trace {

                // turn on and off debugging
                public void setDebug( boolean debug );

                // write out a debug message
                public void debug( String message );

                // write out an error message
                public void error( String message );

          }

          假設寫了兩個實現。一個實現(代碼清單3)將信息寫到命令行,另一個(代碼清單2)則寫到文件中。

          代碼清單2
          public class FileTrace implements Trace {
                   
                private java.io.PrintWriter pw;
                private boolean debug;

                public FileTrace() throws java.io.IOException {
                      // a real FileTrace would need to obtain the filename somewhere
                      // for the example I'll hardcode it
                      pw = new java.io.PrintWriter( new java.io.FileWriter( "c:\trace.log" ) );
                }

                public void setDebug( boolean debug ) {
                      this.debug = debug;
                }

                public void debug( String message ) {
                      if( debug ) {  // only print if debug is true
                            pw.println( "DEBUG: " + message );
                            pw.flush();
                      }
                }
                public void error( String message ) {
                      // always print out errors
                      pw.println( "ERROR: " + message );
                      pw.flush();
                }

          }

          代碼清單3
          public class SystemTrace implements Trace {

                private boolean debug;

                public void setDebug( boolean debug ) {
                      this.debug = debug;
                }

                public void debug( String message ) {
                      if( debug ) {  // only print if debug is true
                            System.out.println( "DEBUG: " + message );
                      }
                }
                public void error( String message ) {
                      // always print out errors
                      System.out.println( "ERROR: " + message );
                }

          }

          要使用這兩個類中的任一個,需要這樣做:

          代碼清單4
          //... some code ...
          SystemTrace log = new SystemTrace();
          //... code ...
          log.debug( "entering loog" );
          // ... etc ...

          現在,如果想改變程序中用到的 "Trace實現",就需要修改實例化 "Trace實現" 的每個類。使用了Trace的類的數量可能很多,這種修改就需要大量的工作。而且,你一定也想盡可能地避免大量修改你的類。

          代碼清單5
          public class TraceFactory {
                public static Trace getTrace() {
                      return new SystemTrace();
                }
          }

          getTrace()是一個Factory method。這樣,無論什么時候你想得到一個Trace的引用,只用簡單地調用TraceFactory.getTrace():

          代碼清單6
          //... some code ...
          Trace log = new TraceFactory.getTrace(); 

          posts - 131, comments - 12, trackbacks - 0, articles - 32

          Copyright © yukui

          主站蜘蛛池模板: 泰安市| 三江| 白山市| 东光县| 嘉善县| 泰兴市| 唐河县| 平原县| 嵊泗县| 缙云县| 安龙县| 新余市| 临猗县| 曲水县| 滨州市| 夏河县| 瓦房店市| 铁岭市| 武宣县| 陕西省| 嫩江县| 石景山区| 合水县| 皮山县| 滦南县| 隆德县| 靖远县| 桐庐县| 光泽县| 吴江市| 邵武市| 苍山县| 嫩江县| 苍溪县| 延长县| 原阳县| 长春市| 汶川县| 秭归县| 阿鲁科尔沁旗| 临汾市|