設計模式學習--Factory Method
What
Factory Method:定義一個建立物件的介面,讓子類來決定例項化哪一個類。Factory Method使一個類的例項化延遲到其子類。
Why
Factory Method是一個比較基礎的建立型模式,它主要在於由子類決定例項化哪一個類。主要用於框架程式碼或者工具包中。
適用於如下場景:
1、當一個類不知道它所必須建立的物件的類的時候
2、當一個類希望由子類來指定它所建立物件的時候
3、當類將建立物件的職責委託給多個幫助子類的某一個,並且你希望將哪一個幫助子類是代理者這一資訊區域性化的時候
How
假設如下場景,寫一個語法分析器,需要支援C與java程式碼的語法分析,需要完成程式碼語法檢查和語法解析工作。以此為例實現工廠模式。
語法分析器介面
public interface Parsing {
void checkGrammar();
void parseCode();
}
C程式碼語法分析器實現
public class CParsing implements Parsing {
@Override
public void checkGrammar() {
System.out.println("check c grammar");
}
@Override
public void parseCode() {
System.out.println("parse c code" );
}
}
Java程式碼語法分析器實現
public class JavaParsing implements Parsing {
@Override
public void checkGrammar() {
System.out.println("check java grammar");
}
@Override
public void parseCode() {
System.out.println("parse java code");
}
}
解析器工廠介面
public interface ParsingFactory {
Parsing createParsing();
}
C程式碼解析器工廠實現
public class CParsingFactory implements ParsingFactory {
@Override
public Parsing createParsing() {
return new CParsing();
}
}
Java程式碼解析器工廠實現
public class JavaParsingFactory implements ParsingFactory {
@Override
public Parsing createParsing() {
return new JavaParsing();
}
}
客戶端呼叫
public class App {
public static void main( String[] args ){
ParsingFactory factory=new CParsingFactory();
Parsing parsing=factory.createParsing();
parsing.checkGrammar();
parsing.parseCode();
ParsingFactory factory1=new JavaParsingFactory();
Parsing parsing1=factory1.createParsing();
parsing1.checkGrammar();
parsing1.parseCode();
}
}
以上示例類圖如下:
Discuss
Abstarct Factory VS Factory Method
在學習Factory Method就對Factory Method模式和Abstarct Factory很迷惑,經過反覆閱讀兩個章節,基本上總結出了兩者的一個聯絡,Abstarct Factory是一個特殊的Factory Method,但是兩者區別在哪呢?
完成Factory Method的示例發現,在Abstract Factory中示例的UML和Factory Method的示例的UML是結構是一樣的,於是就思考為什麼?
兩者的意圖如下:
Factory Method:定義一個建立物件的介面,讓子類來決定例項化哪一個類。Factory Method使一個類的例項化延遲到其子類。
Abstarct Factory:提供一個建立一系列相關或相互依賴的介面,而無需指定他們具體類。
從以上粗體部分就可以體現其區別的地方。
1.Abstarct Factory強調的是建立一系列相關相互依賴的介面,也就是Abstarct這個工廠可以生產一系列的物件,是一個一對多的關係,然後我又重新考慮了一下,Abstarct Factory的示例,並進行了完善(詳情見:設計模式學習--Abstarct
Factory的ChangeLog)。它的擴充套件性側重橫向擴充套件。比如在Abstarct Factory學習中的例子,我們又來一個RoleDao,我們是在DaoFactory中增加createRoleDao方法。
2.Factory Method強調的是建立一個物件介面,讓子類來決定例項化哪一個類,也就是它的工廠和產品是一對一的關係。它的擴充套件性側重的是垂直擴充套件,比如本節的示例,我們需要增加一個支援Sql語言的語法分析器,我需要增加一個SqlParsingFactory類和一個SqlParsing類。
關於Abstarct Factory VS Factory Method的討論還有如下可以參考:
http://www.cnblogs.com/happyhippy/archive/2010/09/26/1836223.html
http://www.cnblogs.com/procoder/archive/2009/04/24/1442920.html