Java Q&A: 使用Factory Method模式 (轉)
Q&A: 使用Factory Method
Q: 閱讀 "Polymorphism in its purest form" 一文時,我看到了一個不熟悉的術語 "Factory method"。你能解釋一下什麼是Factory method並說明如何使用它嗎?
A: Factory method(工廠方法)只不過是例項化的一種方法的名稱。就象工廠一樣,Factory method的任務是建立--或製造--物件。
讓我們看一個例子。
每個要有一種報錯的方式。看看下面的介面:
程式碼清單1
public interface Trace {
// turn on and off deging
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();
//... code ...
log.debug( "entering loog" );
// ... etc ...
使用Factory method來獲得例項可以大量節省以後的工作。上面的程式碼中,TraceFactory返回的是SystemTrace例項。假設需求發生了變化,需要將資訊寫到檔案中。如果是使用Factory method來獲得例項,只用在一個類中修改一次就可以滿足新的需求。你就不用在使用了Trace的的每個類中進行修改了。也就是說,只用簡單地重定義getTrace():
程式碼清單7
public class TraceFactory {
public static Trace getTrace() {
try {
return new FileTrace();
} catch ( java.io.IOException ex ) {
Trace t = new SystemTrace();
t.error( "could not instantiate FileTrace: " + ex.getMessage() );
return t;
}
}
}
當不能確定一個類的什麼具體實現要被例項化時,Factory method會很有用。你可以將那些細節留給Factory method。
在上面的例子中,你的程式不知道要建立FileTrace還是SystemTrace。因而,你可以只是用Trace來處理物件,對具體實現的例項化則留給Factory method。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990829/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java Q&A: 使用Observer模式 (轉)JavaServer模式
- 設計模式、用Delphi描述-->Factory Method模式 (轉)設計模式
- JAVA設計模式之 工廠方法模式【Factory Method Pattern】Java設計模式
- Factory Method 工廠方法模式(建立型模式)模式
- 設計模式--工廠方法模式(Factory Method Pattern)設計模式
- 設計模式之工廠方法模式(FACTORY METHOD)設計模式
- 設計模式(Design Patterns)工廠方法模式(Factory Method)設計模式
- C#設計模式系列:工廠方法模式(Factory Method)C#設計模式
- Java Q&A: 使用Singleton模式?給我一個理由先! (轉)Java模式
- 設計模式的征途—3.工廠方法(Factory Method)模式設計模式
- 使用C# (.NET Core) 實現簡單工廠(Simple Factory) 和工廠方法設計模式 (Factory Method Pattern)C#設計模式
- 用Java實現的設計模式系列(1)-Factory (轉)Java設計模式
- Java設計模式之工廠模式(Factory)Java設計模式
- Delphi設計模式-Abstract Factory (轉)設計模式
- 我所理解的設計模式(C++實現)——工廠方法模式(Factory Method Pattern)設計模式C++
- 設計模式、用Delphi描述-->Abstract Factory模式 (轉)設計模式
- 請教AbstractFactory 和 Factory method 的區別
- 深入探索Factory模式與Prototype模式的異同 (轉)模式
- JAVA設計模式之 抽象工廠模式【Abstract Factory Pattern】Java設計模式抽象
- JAVA設計模式之 模板方法模式【Template Method Pattern】Java設計模式
- JAVA設計模式之 簡單工廠模式【Simple Factory Pattern】Java設計模式
- 設計模式討論之abstract factory篇 (轉)設計模式
- java程式碼中init method和destroy method的三種使用方式Java
- 設計模式之---模板方法template method的使用設計模式
- 《設計模式》 - 2. 工廠模式( Factory )設計模式
- 設計模式--工廠模式Factory(建立型)設計模式
- 設計模式(Design Patterns)筆記之一:Abstract Factory (轉)設計模式筆記
- 設計模式應用之Template method模式設計模式
- JAVA Method的解析Java
- 設計模式--抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- Scala 與設計模式(四):Factory 工廠模式設計模式
- 設計模式-抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- Henry手記—使用Template Method設計模式的.NET事件處理機制(一) (轉)設計模式事件
- Henry手記—使用Template Method設計模式的.NET事件處理機制(二) (轉)設計模式事件
- 設計模式-Template Method Pattern設計模式
- 使用java.lang.reflect.Method遇到的問題Java
- Java的秘密:使用全螢幕模式 (轉)Java模式
- 簡單工廠模式(Simple Factory Pattern)模式