以Java 程式範例來探討Design Pattern:Factory Method

文章推薦指數: 80 %
投票人數:10人

以 Java 程式範例來探討 Design Pattern: Factory Method. 作者:李元豪. 使用的時機與目的:. 當我們撰寫應用程式時,如果無法明確地知道要產生的類別,需使用那一種 ... 以 Java程式範例來探討 DesignPattern:FactoryMethod 作者:李元豪 使用的時機與目的: 當我們撰寫應用程式時,如果無法明確地知道要產生的類別,需使用那一種物件型態時,你應該考慮使用FactoryMethod 模式,讓子類別去指定要生成物件的類型;比如說現在你要寫一個能使用多種文件型態的應用程式(Application),有時候你想使用text 型態的文件,有時候你想使用Doc.型態的文件,如果你把某種文件的類型寫死在應用程式時,程式將變得毫無彈性,不容易修改,不能再利用。

不良的解決方式: classTextDocument{        TextDocument(){                 System.out.println("IamclassTextDocument");        }        voidOpen(){                System.out.println("OpenaTextDocument");        }        voidSave(){                System.out.println("SavetheTextDocument");        }        voidClose(){                System.out.println("ClosetheTextDocument");        } } classMyApplication{        publicstaticvoidmain(String[]args){                 TextDocumentdoc=newTextDocument();                 doc.Open();                 doc.Save();                 doc.Close();        } } 像這樣把某種文件類型寫死在應用程式裡,如果你想使用Doc.的文件類型,那MyApplication 類別勢必要重寫。

如果你的應用程式需要用到數十種不同的文件類型,那MyApplication 類別是不是要重寫數十遍?上面的程式例子還簡單,如果你的應用程式很複雜,單單修改程式碼就夠你瞧,更不用說測試、除錯了! 使用FactoryMethod 模式:「DesignPatterns」這本書提到有三、四種解決的方式。

使用參數的方式。

使用類別變數的方式。

平行類別階層方式。

C++還可使用template的方式。

使用參數的方式: 程式碼: publicabstractclassDocument{    publicabstractvoidOpen();    publicabstractvoidSave();    publicabstractvoidClose(); } publicabstractclassApplication{    intselect;    publicabstractDocumentCreateDocument(intselect);    publicvoidNewDocument(){        Documentdoc=CreateDocument(select);        doc.Open();        doc.Save();        doc.Close();    } } publicclassTextDocumentextendsDocument{    publicTextDocument(){        System.out.println("Iamclass TextDocument");    }    publicvoidOpen(){        System.out.println("Iopena TextDocument");    }    publicvoidSave(){        System.out.println("Isavethe TextDocument");    }    publicvoidClose(){        System.out.println("Iclosethe TextDocument");    } } publicclassDocDocumentextendsDocument{    publicDocDocument(){        System.out.println("Iamclass DocDocument");    }    publicvoidOpen(){        System.out.println("Iopena DocDocument");    }    publicvoidSave(){        System.out.println("Isavethe DocDocument");    }    publicvoidClose(){        System.out.println("Iclosethe DocDocument");    } } publicclassMyApplicationextends Application{   intselect;    publicMyApplication(){    }    publicDocumentCreateDocument(intselect){        if(select==1)returnnew TextDocument();        if(select==2)returnnewDocDocument();        returnnewTextDocument();    } } publicclassExampleFactory2{   publicExampleFactory2(){    }   publicstaticvoidmain(String[]args){          MyApplicationApp=new MyApplication();          App.select=1;//使用 TextDocument          //App.select=2;//使用 DocDocument          App.NewDocument();    } } 使用類別變數的方式: 程式碼: publicabstractclassDocument程式碼同上。

publicclassDocDocument程式碼同上。

publicclassTextDocument程式碼同上。

publicabstractclassApplication{   protected Documentdoc;    publicApplication(){    }    publicabstractDocumentCreateDocument();    publicvoidNewDocument(){        doc=CreateDocument();        doc.Open();        doc.Save();        doc.Close();    } } publicclassMyApplicationextends Application{   publicMyApplication(){    }    publicDocumentCreateDocument(){        returndoc;    } } publicclassExampleFactory3{   publicExampleFactory3(){    }    publicstaticvoidmain(String[]args){        MyApplicationApp=newMyApplication();        App.doc=newTextDocument();        //App.doc=newDocDocument();        App.NewDocument();    } } 平行類別階層方式: 程式碼: publicabstractclassDocument程式碼同上。

publicclassDocDocument程式碼同上。

publicclassTextDocument程式碼同上。

publicabstractclassApplication{   publicabstractDocumentCreateDocument(); } publicclassDocApplicationextends Application{   publicDocumentCreateDocument(){        returnnewDocDocument();    } } publicclassTextApplicationextends Application{   publicDocumentCreateDocument(){        returnnewTextDocument();    } } publicclassExampleFactory4{   publicExampleFactory1(){    }    publicstaticvoidmain(String[]args){        DocApplicationDocApp=new DocApplication();        Documentdoc=DocApp.CreateDocument();        //TextApplicationTextApp=new TextApplication();        //Documentdoc= TextApp.CreateDocument();        doc.Open();        doc.Save();        doc.Close();    } }  



請為這篇文章評分?