圖片讀取器和皮膚庫設計

圖片讀取器和皮膚庫設計

無論是圖片讀取器還是皮膚庫設計,其實只是點到爲止,沒有深入做出很好的視覺效果,請見諒。

一、實驗目的

1.結合實例,熟練分析並繪製UML類圖;

2.熟練使用java實現兩種常見的創建型設計模式,包括工廠方法模式、抽象工廠模式。理解每一種設計模式的模式動機,掌握模式結構,學習如何使用代碼實現這些模式。

二、實驗要求

  1. 結合實例,正確無誤地繪製工廠方法模式、抽象工廠模式的模式結構圖;

  2. 要求使用XML和Java反射機制來創建對象。

  3. 使用Java語言實現工廠方法模式、抽象工廠模式實例,代碼運行正確無誤。

、實驗原理

​ 工廠方法模式(Factory Method Pattern)又稱爲工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠(Polymorphic Factory)模式,它屬於類創建型模式。在工廠方法模式中,工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該實例化哪一個具體產品類。

​ 抽象工廠模式(Abstract Factory Pattern):提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,屬於對象創建型模式。

四、實驗步驟、數據記錄及處理

1.圖片讀取器

​ 使用工廠方法模式設計一個程序用來讀取各種不同類型的圖片格式,針對每一種圖片格式都設計一個圖片讀取器(ImageReader),例如GIF圖片讀取器(GifReader)用於讀取GIF格式的圖片、JPG圖片讀取器 (JpgReader)用於讀取JPG格式的圖片。需充分考慮系統的靈活性和可擴展性。

使用工廠方法模式設計一個程序用來讀取各種不同類型的圖片格式,針對每一種圖片格式都設計一個 圖片讀取器(ImageReader),例如GIF圖片讀取器(GifReader)用於讀取GIF格式的圖片、JPG圖片讀取器(JpgReader)用於讀取JPG格式的圖片。需充分考慮系統的靈活性和可擴展性。

分析:用抽象工廠imageReaderFactory去生產抽象的圖片讀取器(ImageReader),由於GIF圖片讀取器(GifReader)用於讀取GIF格式的圖片、JPG圖片讀取器 (JpgReader)用於讀取JPG格式的圖片。所以得有GifReadFactory和JpgReadFactory這兩個工廠以達到產生不同類型的圖片讀取器。考慮到系統的靈活性和可擴展性,則需要將抽象工廠imageReaderFactory和圖片讀取器(ImageReader)定義爲接口的形式。例如增加PNG圖片讀取器用於讀取PNG格式的圖片,只需要實現相應的ImageReader接口和ImageReader Factory接口,增加相應的工廠和圖片讀取器,沒有對原有業務造成影響。客戶端Client調用不同的圖片讀取器讀取相應圖片的信息。XMLUtil則是運用反射機制提供工廠實例化方法getBean()

根據工廠方法模式用rational rose對題設內容進行uml建模,類圖如下所示。

在這裏插入圖片描述

那麼如何實現不同讀取器的調度呢?

這就取決於工廠生產哪個圖片讀取器。這樣就從圖片讀取器的調度轉換到不同工廠之間的調度。我們通過改變工廠註冊文件config.xml來實現。

在這裏插入圖片描述

2.皮膚庫

某軟件公司欲開發一套界面皮膚庫,可以對桌面軟件進行界面美化。不同的皮膚將提供視覺效果不同的按鈕、文本框、組合框等界面元素,其結構如下圖所示:
在這裏插入圖片描述

該皮膚庫需要具備良好的靈活性和可擴展性,用戶可以自由選擇不同的皮膚,開發人員可以在不修改既有代碼的基礎上增加新的皮膚。試使用抽象工廠模式設計該皮膚庫,繪製類圖並編程模擬實現。

分析:抽象皮膚庫工廠可以生產多種結構的產品,按鈕,文本框,組合框,而每個具體工廠可以生產出同種產品,不同結構的產品,即Spring風格和Summer風格屬於不同的具體工廠的產品。

根據抽象工廠模式用ratioal rose 對題設內容進行uml建模,類圖如下所示

在這裏插入圖片描述

考慮到要實現不同的按鈕,文本框,組合框,所以每個繼承JFrame類。

在這裏插入圖片描述

五、實驗中所出現的問題及解決方案

圖片讀取器

(1) 配置文件路徑不對,這將會導致工廠無法註冊?

根據idea控制檯打印的路徑對比自己填寫的路徑改正。

(2) 圖片格式如何判斷?

通過查找資料,發現jdk類庫中提供有圖片輸入流,然後再用迭代器決解。

(3) 圖片信息如何判斷?

類庫中提供有ImageIo,可以讀取圖片信息。

皮膚庫

(1) 如何實現不同顏色的按鈕、綠色邊文本框、綠色邊框組合框?

通過查找資料,以依賴注入的方式,添加按鈕JButton,組合框JComBox,文本框JTextField。不同顏色的邊框設置方法:

​ setBorder ( BorderFactory.createLineBorder ( Color.GREEN,5 ) )

六、實驗結果

(1)圖片讀取器

Gif圖片讀取器工廠註冊
在這裏插入圖片描述
選擇圖片cat.gif,輸出結果
在這裏插入圖片描述

Jpg圖片讀取器工廠註冊
在這裏插入圖片描述

選擇圖片2.jpg,輸出結果

在這裏插入圖片描述

(2)皮膚庫

Spring風格的工廠註冊

在這裏插入圖片描述

結果展示
在這裏插入圖片描述

從左到右依次是SpringButton、SpringTextBox、SpringComboBox。

Summer風格的工廠註冊

在這裏插入圖片描述

結果展示

在這裏插入圖片描述

七、實驗心得

圖片讀取器

首先加深了對設計模式的理解,我認爲設計模式是編程套路,這些編程套路從結構上大致是不會改變的,既然是不變的,那麼照着這種固定結構,只要完成uml建模,畫出類圖,那麼完成編程是比較容易的。接着談談本例應用工廠方法模式解決的看法,聯繫實際,不同的圖片讀取器又怎麼會在不同的工廠中生產呢?一般地,都會是一個工廠生產出不同的圖片讀取器,所以我覺得這裏用圖片讀取器案例理解工廠方法模式是有待商榷的。

接着對於工廠方法模式的結構更加深刻。最後就是對於實現實例化的getBean()方法,應用dom模型讀取配置文件,積累更多思路。

皮膚庫

當用抽象工廠模式實現皮膚庫的基本框架後,就是ui處理,抽象工廠模式與工廠方法模式更具有實際意義。

八、項目結構

圖片讀取器

在這裏插入圖片描述

在這裏插入圖片描述

皮膚庫

在這裏插入圖片描述

九、待改進問題

​ 1.實際上在圖片讀取器中,ImageFormat類可以讀取各種格式的圖片,讓具體圖片讀取器繼承它,就顯得有些大材小用,窄化功能的意味。

​ 2.在實現皮膚庫中,讓每個具體組件繼承JFrame,顯然組件之間的耦合增加了。

十、源代碼

源碼地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章