程式扎記: [OO 設計模式] Gossip@DesignPattern : Creational - Factory Method 模式

標籤

2015年9月11日 星期五

[OO 設計模式] Gossip@DesignPattern : Creational - Factory Method 模式

來源自 這裡 
Preface: 
Factory Method 模式在一個抽象類別中留下某個建立元件的抽象方法沒有實作,其它與元件操作相關聯的方法都先依賴於元件所定義的介面,而不是依賴於元件的實 現, 當您的成品中有一個或多個元件無法確定時,您先確定與這些元件的操作介面,然後用元件的抽象操作介面先完成其它的工作,元件的實作(實現)則推遲至實現元 件介面的子類完成,一旦元件加入,即可完成您的成品. 簡單地說,如果您希望如何建立父類別中用到的物件這件事,是由子類別來決定,可以使用 Factory Method

Factory Method Usage: 
舉一個例子,假設您要完成一個文件編輯器,您希望這個編輯器可以適用於所有類型的檔案編輯,例如 RTF、DOC、TXT 等等,儘管這些文件有著不同的格 式,您先確定的是這些文件必然具備的一些操作介面,例如儲存、開啟、關閉等,您用一個 Document 類型來進行操作,這麼一來這個框架就無需考慮實 際的儲存、開啟等細節是如何進行的: 
  1. import java.util.*;  
  2.   
  3. abstract class Document {  
  4.     private String title;  
  5.     String getTitle() {  
  6.         return title;  
  7.     }  
  8.     void setTitle(String title) {  
  9.         this.title = title;  
  10.     }  
  11.     abstract void open();  
  12.     abstract void save();  
  13.     abstract void close();  
  14. }  
  15.   
  16. abstract class Editor {  
  17.     private List docs = new ArrayList();  
  18.       
  19.     void open(String file) {  
  20.         Document doc = createDocument();  
  21.         doc.setTitle(file);  
  22.         doc.open();  
  23.         docs.add(doc);  
  24.     }  
  25.      
  26.     void save(Document doc) {  
  27.         doc.save();  
  28.     }  
  29.       
  30.     void close(Document doc) {  
  31.         doc.close();  
  32.         docs.remove(doc);  
  33.     }  
  34.       
  35.     void close() {  
  36.         for(Document doc : docs) {  
  37.             close(doc);  
  38.         }  
  39.     }  
  40.       
  41.     // ... 其它的方法定義  
  42.     abstract Document createDocument(); // Factory method  
  43. }  
Document 為 abstract class 或 interface 定義並不重要,重要的是 Editor 中,流程中所操作的都是 Document 的公開方法,實際上如何建立具體的 Document,則由子類別來完成,例如: 
  1. class TextEditor extends Editor {  
  2.     Document createDocument() {  
  3.         return new Document() {  
  4.             void open() {  
  5.                 System.out.println("開啟文字檔案 " + this.getTitle());  
  6.             }  
  7.             void save() {  
  8.                 System.out.println("儲存文字檔案 " + this.getTitle());  
  9.             }  
  10.             void close() {  
  11.                 System.out.println("關閉文字檔案 " + this.getTitle());  
  12.             }              
  13.         };  
  14.     }  
  15. }  
  16.   
  17. public class Main {  
  18.     public static void main(String[] args) {  
  19.         Editor editor = new TextEditor();  
  20.         editor.open("Main.java");  
  21.         editor.open("Editor.java");  
  22.         editor.close();  
  23.     }  
  24. }  
UML class diagram: 
以 UML 圖來表示 Factory method 類別結構如下所示: 

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!