設計模式學習--Factory Method

What

Factory Method:定義一個建立對象的接口,讓子類來決定實例化哪個類。Factory Method使一個類的實例化延遲到其子類。html

Why

Factory Method是一個比較基礎的建立型模式,它主要在於由子類決定實例化哪個類。主要用於框架代碼或者工具包中。
適用於以下場景:
一、當一個類不知道它所必須建立的對象的類的時候
二、當一個類但願由子類來指定它所建立對象的時候
三、當類將建立對象的職責委託給多個幫助子類的某一個,而且你但願將哪個幫助子類是代理者這一信息局部化的時候java

How

假設以下場景,寫一個語法分析器,須要支持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();
    }
}

以上示例類圖以下:設計


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

相關文章
相關標籤/搜索