Factory Method:定義一個建立對象的接口,讓子類來決定實例化哪個類。Factory Method使一個類的實例化延遲到其子類。html
Factory Method是一個比較基礎的建立型模式,它主要在於由子類決定實例化哪個類。主要用於框架代碼或者工具包中。
適用於以下場景:
一、當一個類不知道它所必須建立的對象的類的時候
二、當一個類但願由子類來指定它所建立對象的時候
三、當類將建立對象的職責委託給多個幫助子類的某一個,而且你但願將哪個幫助子類是代理者這一信息局部化的時候java
假設以下場景,寫一個語法分析器,須要支持C與java代碼的語法分析,須要完成代碼語法檢查和語法解析工做。以此爲例實現工廠模式。
語法分析器接口設計模式
public interface Parsing { void checkGrammar(); void parseCode(); }
C代碼語法分析器實現app
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"); } }
解析器工廠接口ide
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(); } }
客戶端調用spa
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(); } }
以上示例類圖以下:設計
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