1. 程式人生 > >設計模式學習--Factory Method

設計模式學習--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