国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Java深入分析之:使用FactoryMethod模式

2019-11-18 13:33:48
字體:
供稿:網(wǎng)友

  閱讀 "Polymorphism in its purest form" 一文時,我看到了一個不熟悉的術(shù)語 "Factory method"。你能解釋一下什么是Factory method并說明如何使用它嗎?
  
  A: Factory method(工廠方法)只不過是實例化對象的一種方法的名稱。就象工廠一樣,F(xiàn)actory method的任務(wù)是創(chuàng)建--或制造--對象。
  
  讓我們看一個例子。
  
  每個程序要有一種報錯的方式。看看下面的接口:
  
  代碼清單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 );
  
  }
  
  假設(shè)寫了兩個實現(xiàn)。一個實現(xiàn)(代碼清單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 ...
  
  現(xiàn)在,假如想改變程序中用到的 "Trace實現(xiàn)",就需要修改實例化 "Trace實現(xiàn)" 的每個類。使用了Trace的類的數(shù)量可能很多,這種修改就需要大量的工作。而且,你一定也想盡可能地避免大量修改你的類。
  
  代碼清單5
  
  public class TraceFactory {
  public static Trace getTrace() {
  return new SystemTrace();
  }
  }
  
  getTrace()是一個Factory method。這樣,無論什么時候你想得到一個Trace的引用,只用簡單地調(diào)用TraceFactory.getTrace():
  
  代碼清單6
  
  //... some code ...
  Trace log = new TraceFactory.getTrace();

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 洛阳市| 河曲县| 宁都县| 许昌市| 镇坪县| 阜城县| 安溪县| 凤台县| 黄山市| 郴州市| 施甸县| 赣州市| 玉树县| 光泽县| 镇雄县| 漳平市| 齐齐哈尔市| 汕尾市| 江油市| 绍兴市| 广平县| 武强县| 青州市| 丰都县| 达州市| 随州市| 望城县| 绥德县| 双辽市| 富顺县| 江山市| 南皮县| 翁牛特旗| 台南市| 灵台县| 都江堰市| 马公市| 铜陵市| 桦南县| 罗山县| 张掖市|