以Java 程式範例來探討Design Pattern:Factory Method
文章推薦指數: 80 %
以 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();
}
}
延伸文章資訊
- 1一起幫忙解決難題,拯救IT 人的一天
Learning Design Pattern in 30 real-case practices 系列第1 篇 ... 買(借)本好書; 初步了解設計模式(先有概念); 模仿及練習書上範例; ...
- 2設計模式學習筆記- Study Design Pattern In Java
... 模式的聖經Design Patterns : Elements of Re-usable Object-Oriented Software,發現這本書很難, 只好先放棄,真正開始是從大話...
- 3工廠模式Factory · 設計模式學習筆記
工廠模式Factory Pattern. 目的:提供一個工廠介面,將產生實體的程式碼交由子類別各自實現. 進化的新手村. 剛才的簡單工廠模式因為只有一個工廠,要新增產品種類要 ...
- 4這可能是你第一個接觸到的Design Pattern - 叡揚資訊
簡介這次要跟大家介紹的是Composite Pattern,這是GoF(Gang of Four)經典 ... 此範例是採用C#實作簡易版的公司職員管理,下圖為UML類別圖,僅有2個 ...
- 5[Design Pattern] 策略模式(Strategy Pattern) 把跑車行為裝 ...
範例. 舉例說明,假如公司開發了一款賽車遊戲,遊戲內一定包含各種不同款跑車而每款車都有加速 ...