歡迎您光臨本站 註冊首頁

Factory Method模式在Javamail中的應用

←手機掃碼閱讀     火星人 @ 2014-03-10 , reply:0

  設計模式在軟體工程中佔有重要地位,而JavaMail是Java平台的一個擴展,為管理電子郵件提供了統一的應用編程介面.本文討論Factory Method設計模式在Javamail中的應用.

  1、模式簡介

  模式的概念最早是出現在城市建築領域的.lexander的一本關於建築的書中明確的給出了模式的概念,用來解決在建築中的一些問題.後來,這個概念逐漸的被計算機科學所採納.《Design Patterns: Elements of Reusable Object-Oriented Software》[1](以下簡稱《設計模式》)則堪稱設計模式領域的經典書籍之一.它開創了軟體工程領域的模式化進程.

  設計模式的簡單定義就是對於一類重複出現的問題的可重用的解決方案.在軟體工程中一個設計模式解決一類軟體設計問題.設計模式中許多方法其實很早就出現了,並且在應用中也比較多.但是直到《設計模式》出來之前,並沒有一種統一的認識.或者說,那時候並沒有對模式形成一個概念.這些方法還僅僅是處在經驗階段,並沒有能夠被系統的整理,形成一種理論.

  每一個設計模式都系統的命名,解釋和評價了面向對象系統中的一個重要的和重複出現的設計.這樣,我們只要搞清楚這些設計模式,就可以完全或者說很大程度上吸收了那些蘊含在模式中的寶貴的經驗,對面向對象的系統能夠有更為完善的了解.更為重要的是,這些模式都可以直接用來指導面向對象系統中至關重要的對象建模問題.如果有相同的問題背景,那麼很簡單,直接套用這些模式就可以了.這可以省去你很多的工作.

  在《設計模式》一書中涉及到23個模式,被分類為創建型模式(Creational Patterns),結構型模式(Structural Patterns)和行為模式(Behavioral Patterns),分別從對象的創建,對象和對象間的結構組合以及對象交互這三個方面為面向對象系統建模方法給予了解析和指導.

  其中創建型設計模式(Creational Patterns)描述怎樣創建一個對象.它隱藏對象創建的細節,使程序代碼不依賴具體的對象,這樣當我們增加一個新的對象時幾乎不需要修改代碼.結構型設計模式(Structural Patterns)描述類和對象之間怎麼組織起來形成大的結構,主要使用繼承來組織介面或實現.行為型設計模式(Behavioral Patterns)描述演算法以及對象之間的任務分配,它所描述的不僅僅是對象或類的設計模式,還有它們之間的通訊模式.

  設計模式在Java中得到了廣泛應用.在《Thinking in Java》[3]一書中,Bruce Eckel介紹了Singleton、Prototype、Observer、Visitor等設計模式在Java中的具體應用和實現,以下將介紹Factory Method設計模式在Javamail中的應用.從中可看出設計模式不僅有助於軟體設計,對理解軟體結構也很有幫助.

  2、Javamail簡介

  經過幾年的發展,Java語言已相當成熟,並在各領域得到廣泛應用.特別是J2EETM(JavaTM 2 Platform, Enterprise Edition)的出現,更是極大地方便了分散式應用程序的創建.作為Java平台的一個擴展--JavaMail,也是J2EETM的技術之一,為管理電子郵件提供了統一的應用編程介面(API,Application Programming Interface).它使服務提供者(service providers)可以使用Java語言為它們自己的郵件或消息處理系統提供一致的介面,應用程序可以使用這些一致的介面方便地與這些系統通信.

  以下是一些Javamail API中的抽象類,由它們可以組成典型的郵件系統:

  Message-代表一個電子郵件消息.

  Folder-以分級的形式組織消息.一個Folder可以包含多條消息、多個Folder.

  Store-代表由郵件伺服器 style="COLOR: #000000" href="http://server.it168.com/" target=_blank>伺服器管理的消息資料庫,一個具體的Store使用一種特殊的訪問協議(如Pop3Store使用Pop3協議,IMAPStore使用IMAP協議),並可包含一個或多個Folder.

  Transport-代表一個特殊的傳輸協議,一個具體的Transport使用具體的傳輸協議發送消息.

  3、設計模式Factory Method

  此模式屬於創建型設計模式,它只定義創建對象的介面,而由它的子類負責創建具體的對象,利用子類實例化不同的對象.圖一是Factory Method 模式結構的類圖(Class Diagram),其中:

  Product 定義了由factory method所創建對象的統一介面.

  ConcreteProduct 具體的類,實現Product介面.

  Creator 一般為抽象類,聲明若干factory method(方法),由它創建類型為Product的對象.正因為它能"生產"對象,稱為factory method.Creator也可能擁有一個方法創建某個預設的具體對象.

  ConcreteCreator 重載factory method以創建某個 ConcreteProduct 的具體實例.

  也就是說Creator依賴於ConcreteCreator創建Product型的ConcreteProduct對象. Factory method使應用程序代碼只需處理Product介面,而與具體的類(ConcreteProduct)無關,增強了代碼可重用性,因為它獨立於用戶定義的具體的類.

  

  4、Factory Method在Javamail中的應用

  

  圖二指示了Factory Method在Javamail中的應用.其中的類Store相當於圖一中的Creator,Store的兩個子類Pop3Store,IMAPStore相當於圖一中的ConcreteStore,類Folder相當於Product,Folder的兩個子類Pop3Folder和IMAPFolder相當於ConcreteProduct,而Store中的方法getFolder就是一個factory method,由子類Pop3Store實例化Pop3Folder,由IMAPStore實例化IMAPFolder.

  類似的圖二中的Folder相對於Store來說是Product,但相對於Messsage卻也是一個Creator,其方法getMessage同樣也是factory method.

  4.1可重用性

  

  上表是使用Factory Method模式創建對象和直接創建對象的比較,顯然前者對於創建不同的對象所用的代碼幾乎相同,便於代碼重用,而後者對於創建不同的對象所用代碼就相差很大,想做改動就比較麻煩,若想重用就幾乎是不可能的.設計可重用的面向對象軟體是十分不易的,恰當地運用設計模式則可在一定程度上解決這個問題.

  4.2 可擴展性

  如有一種對應與Pop3、IMAP的新的郵件協議NewP,則很容易使系統支持這種新的協議,擴展Store建立新類NewPStore,擴展Folder建立新類NewPFolder,擴展Message建立新類NewPMessage,就建立起了新協議的大致框架.

  5、Parameterized Factory Method在Javamail中的應用

  Factroy Method設計模式還有一個變異Parameterized factory method模式.對於Parameterized factory method模式,其factory method有一參數,用於指明需創建的對象的類型,這樣一個類的factory method可以創建多種具體類型(ConcreteProduct)的對象,與Factory Method相同的是它所創建的對象都具有同樣的介面Product.

  在Javamail中有一個final static類Session,不能創建它的子類,通過此類設置和訪問一些特殊的屬性,另外此類還擁有若干Parameterized Factory Method,可以創建多種對象.

  5.1可重用性

  圖三中的getStore和getTransport都是Parameterized Factory Method,以getStore為例,給參數以不同的值就能創建不同的對象.例如:

  如上代碼所示,通過給出不同的參數,即能實例化不同的對象,其代碼重用是相當簡單的.

  5.2可擴展性

  若你新建了一個郵件系統,擁有Store的特殊子類NewPStore,此類採用特殊的協議NewP,並已進行了相關設置,如在javamail.default.providers文件中設置了:


[火星人 ] Factory Method模式在Javamail中的應用已經有275次圍觀

http://coctec.com/docs/java/show-post-62024.html