手機開發人員通常使用 Generic Connection Framework 在 Mobile Information Device PRofile (MIDP) 中創建和維護順利的連接。好的架構師都知道該框架背后真正的動力是不可缺少的工廠設計模式。工廠設計模式是面向對象編程所必需的,它構成了應用程序開發人員使用的大多數強大框架的基礎 —— 包括 MIDP。在本月的架構性聲明 專欄中,我將介紹工廠模式的三種變體,然后展示如何在 MIDP 2.0 通用連接框架中工廠支持連接處理。
工廠模式
工廠設計模式是面向對象編程中最常用的設計模式之一。它又被稱為創建性模式,因為它被用來創建其他類。在應用程序預見不到自己要創建的對象類型時,就會使用工廠解決方案。在這些情況下,可以使用工廠模式作為創建對象的基礎,不需要確切地了解將要創建哪些對象。
工廠 實際上是一組模式的名稱,這組模式的目的是創建類。每個變體都指定一個不同的創建方法。這些模式變體是:
首先,我先一般性地查看一下工廠模式解決常見應用程序設計問題的方式。然后將演示工廠模式如何開始對 MIDP 2.0 中大量連接類型的連接進行處理。
基于工廠的解決方案
不管使用哪種變體,所有的工廠模式都是通過將應用程序從將要初始化的類中隔離出來進行啟動,實現方法是插入一個 factory 類來做實際的創建工作。圖 1 是工廠模式的結構圖??梢钥吹剑珻lient 是需要創建新實例的應用程序或類,ProdUCt 是需要創建的類;Factory 是實際創建產品的類。 

圖 2 是工廠模式使用方式的概述,其中的工廠可以創建兩種產品。

客戶機使用工廠類中的不同方法來創建 ProductA 和 ProductB 的實例。該模式的優點在于,只要工廠接口可用,客戶機就不需要考慮如何創建對象。例如,客戶機只需要調用以下代碼,就可以創建 ProductA 類的實例。
ProductA p = Factory.createA();更高級的解決方案
雖然以上設置非常有用,但它確實存在一些限制。首先,客戶機需要知道它要初始化哪些類。例如,如果需要添加第三個類 ProductC (或類似的情況),那么既需要修改客戶機,也需要修改工廠類。工廠類還需要一些新方法,客戶機也必須能夠處理 ProductC。雖然修改一個 Factory 類很簡單,但可能有許多客戶機需要考慮。修改所有客戶機并不是好的解決方案,而且有可能無法實現。 
工廠模式的更高級實現要向產品類添加一個抽象層。然后,客戶機可以只引用抽象產品,而不必引用 ProductA 或 ProductC。我在 圖 3 中實現了該操作,從圖中可以看出,除了兩個具體產品(現在是 ConcreteProductA 和 ConcreteProductB)之外,現在有了一個抽象的 Product。

圖 3 中更高級的實現讓客戶機使用抽象產品進行對象處理,讓 Factory 類創建具體的產品類實例。圖 3 中還需要注意的是,工廠現在是抽象的。這樣,在需要新工廠時(例如,需要創建新類時),就可以容易地構建新工廠。
工廠模式簡化了類的創建,而且為在現有應用程序中做修改提供了良好基礎。但是,不要太過興奮,碰到能用的地方就到處使用該模式。在某些情況下,工廠模式會給應用程序帶來超乎需要的復雜性。作為架構師,您必須問自己:更簡單、通用性差些的解決方案是否更好。工廠模式最適用的情況是:有許多客戶機要使用應用程序的類,或者進行修改很困難或不可能時。如果要避免對客戶機進行修改,則工廠模式會是一個便捷的解決方案。
            MIDP 2.0 中的工廠模式
MIDP 2.0 通用連接框架用工廠設計模式的高級實現作為基礎。顧名思義,通用連接框架的設計目的是處理所有連接種類。在 MIDP 1.0 中,該框架受到限制,只能處理 HTTP 連接,但是 MIDP 2.0 增加了 HTTPS、串口連接、套接字和更多連接。在這一節,我將把重點放在如何在 MIDP 2.0 通用連接框架中使用工廠設計模式。
通用連接框架
在 圖 4 中,可以看到支持 HTTP 連接處理的那部分通用連接框架。

請注意,因為通用連接框架實現了工廠模式,所以使用 Connection 接口可以處理所有連接。抽象是通過對接口進行擴展實現的。Connector 這個工廠類有一組用來創建連接的 open() 方法。這些 open() 方法接受字符串作為參數。這些參數的表達形式是:
{scheme}:[{target}][{params}]{scheme} 是協議的名稱,例如 HTTP,{target} 通常是某種形式的網絡地址,{params} 由一系列 “;param=value” 形式的等式構成。 
MIDP 中的連接
在 MIDP 中創建連接非常簡單。要做的全部工作就是用正確的字符串調用 open() 方法,并擁有連接。例如,只用一行代碼就可以打開 HTTP 連接:
Connection con = Connector.open("http://www.ibm.com");當字符串參數是正常的 HTTP 地址時,Connector 就打開 HTTP 連接,可以把它當作 Connection 來處理,也可以像下面這樣把它轉變成 HttpConnection:
HttpConnection httpcon = (HttpConnection)con;獲取文件輕而易舉!
建立了 HTTP 連接之后,就可以使用它。在 清單 1 中,我用通用連接框架從 Web 服務器上下載了一個 xml 文件。
HttpConnection con = null;InputStream is	= null;String xml = new String();OutputStream out = null;try {	con = (HttpConnection)Connector.open(this.url);	con.setRequestMethod(HttpConnection.GET);	con.setRequestProperty( "Connection", "close" );		// The call to openInputStream() opens the connection	is	= con.openInputStream();	// Read the XML file	ByteArrayOutputStream bas = new ByteArrayOutputStream();	int ch;	while ((ch = is.read()) != -1) {		bas.write(ch);	}	// The 	xml = bas.toString();	} catch (Exception e) {	e.printStackTrace();} finally {	try {		if (null!=out) out.close();		if (null!= is) is.close();		con.close();	} catch (Exception ex) {		ex.printStackTrace();	}}  首先,我用特定 Web 地址調用 Connector 的 open() 方法,然后設置請求方法和 Connection 屬性。為了實際打開連接,我調用了 openInputStream()。打開了到內容(在這個示例中是 XML 文件)的流之后,我用 ByteArrayOutputStream 來讀取流。
            結束語
雖然多數手機應用程序開發人員都很清楚地知道如何使用 MIDP 2.0 中的通用連接框架,但是很少有人知道或關心實際推動該框架的豐富功能的模式。對于架構師來說,觀察角度是相反的:MIDP 2.0 代表工廠設計模式的優秀(和高級)實現!
在本月的專欄中,通過展示如何從架構師的觀點來查 MIDP 2.0,我將幫助您更好地理解它。關于工廠模式本身,您已經了解了一些知識:即它的工作方式和它最適合解決哪類問題。請繼續關注下個月的專欄,我們將介紹在為下一個手機開發項目選擇技術時可以使用的實踐技巧。
(出處:http://m.survivalescaperooms.com)
新聞熱點
疑難解答