2006 年 3 月 13 日
这个月将学习有关 MIDP 2.0 的更多知识,同 Mikko 一起观察 Mobile Information Device Profile (MIDP) 的通用连接器框架 —— 工厂设计模式。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
手机开发人员通常使用 Generic Connection Framework 在 Mobile Information Device Profile (MIDP) 中创建和维护顺利的连接。好的架构师都知道该框架背后真正的动力是不可缺少的工厂设计模式。工厂设计模式是面向对象编程所必需的,它构成了应用程序开发人员使用的大多数强大框架的基础 —— 包括 MIDP。在本月的架构性声明 专栏中,我将介绍工厂模式的三种变体,然后展示如何在 MIDP 2.0 通用连接框架中工厂支持连接处理。
工厂模式
工厂设计模式是面向对象编程中最常用的设计模式之一。它又被称为创建性模式,因为它被用来创建其他类。在应用程序预见不到自己要创建的对象类型时,就会使用工厂解决方案。在这些情况下,可以使用工厂模式作为创建对象的基础,不需要确切地了解将要创建哪些对象。
工厂 实际上是一组模式的名称,这组模式的目的是创建类。每个变体都指定一个不同的创建方法。这些模式变体是:
- 静态工厂(Static Factory)
- 工厂方法(Factory Method)
- 抽象工厂(Abstract Factory)
首先,我先一般性地查看一下工厂模式解决常见应用程序设计问题的方式。然后将演示工厂模式如何开始对 MIDP 2.0 中大量连接类型的连接进行处理。
基于工厂的解决方案
不管使用哪种变体,所有的工厂模式都是通过将应用程序从将要初始化的类中隔离出来进行启动,实现方法是插入一个 factory
类来做实际的创建工作。图 1 是工厂模式的结构图。可以看到,Client 是需要创建新实例的应用程序或类,Product 是需要创建的类;Factory 是实际创建产品的类。
图 1. 工厂设计模式的结构图 2 是工厂模式使用方式的概述,其中的工厂可以创建两种产品。
图 2. 静态工厂模式的实现客户机使用工厂类中的不同方法来创建 ProductA 和 ProductB 的实例。该模式的优点在于,只要工厂接口可用,客户机就不需要考虑如何创建对象。例如,客户机只需要调用以下代码,就可以创建 ProductA 类的实例。
ProductA p = Factory.createA();
|
更高级的解决方案
虽然以上设置非常有用,但它确实存在一些限制。首先,客户机需要知道它要初始化哪些类。例如,如果需要添加第三个类 ProductC
(或类似的情况),那么既需要修改客户机,也需要修改工厂类。工厂类还需要一些新方法,客户机也必须能够处理 ProductC
。虽然修改一个 Factory
类很简单,但可能有许多客户机需要考虑。修改所有客户机并不是好的解决方案,而且有可能无法实现。
工厂模式的更高级实现要向产品类添加一个抽象层。然后,客户机可以只引用抽象产品,而不必引用 ProductA 或 ProductC。我在 图 3 中实现了该操作,从图中可以看出,除了两个具体产品(现在是 ConcreteProductA 和 ConcreteProductB)之外,现在有了一个抽象的 Product
。
图 3. 带有抽象的工厂设计模式图 3 中更高级的实现让客户机使用抽象产品进行对象处理,让 Factory
类创建具体的产品类实例。图 3 中还需要注意的是,工厂现在是抽象的。这样,在需要新工厂时(例如,需要创建新类时),就可以容易地构建新工厂。
工厂模式简化了类的创建,而且为在现有应用程序中做修改提供了良好基础。但是,不要太过兴奋,碰到能用的地方就到处使用该模式。在某些情况下,工厂模式会给应用程序带来超乎需要的复杂性。作为架构师,您必须问自己:更简单、通用性差些的解决方案是否更好。工厂模式最适用的情况是:有许多客户机要使用应用程序的类,或者进行修改很困难或不可能时。如果要避免对客户机进行修改,则工厂模式会是一个便捷的解决方案。
MIDP 2.0 中的工厂模式
MIDP 2.0 通用连接框架用工厂设计模式的高级实现作为基础。顾名思义,通用连接框架的设计目的是处理所有连接种类。在 MIDP 1.0 中,该框架受到限制,只能处理 HTTP 连接,但是 MIDP 2.0 增加了 HTTPS、串口连接、套接字和更多连接。在这一节,我将把重点放在如何在 MIDP 2.0 通用连接框架中使用工厂设计模式。
通用连接框架
在 图 4 中,可以看到支持 HTTP 连接处理的那部分通用连接框架。
图 4. 部分通用连接框架请注意,因为通用连接框架实现了工厂模式,所以使用 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 文件。
清单 1. 用 GCF 获取 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,我将帮助您更好地理解它。关于工厂模式本身,您已经了解了一些知识:即它的工作方式和它最适合解决哪类问题。请继续关注下个月的专栏,我们将介绍在为下一个手机开发项目选择技术时可以使用的实践技巧。
参考资料
学习
讨论
关于作者
|
|
|
Mikko Kontio 是领先的芬兰软件公司 Softera 的产品经理。他拥有计算机科学的硕士学位,是多部书籍的作者和合作者,最新力作是 Professional Mobile Java with J2ME,由 IT Press 出版。您可以通过 Mikko 的邮件 mikko.kontio@softera.fi 与他联系。
|
分享到:
相关推荐
2. **文件系统访问**:MIDP 2.0允许应用程序直接访问设备的文件系统,这在MIDP 1.0中是不允许的,从而为数据持久化提供了更多可能性。 3. **网络连接**:MIDP 2.0增强了网络连接功能,支持HTTP、HTTPS等协议,使得...
以下将详细介绍Struts 2框架的核心概念、主要功能以及在Web 2.0开发中的应用。 1. **Struts 2框架基础** Struts 2是由Apache软件基金会维护的开源项目,它是Struts 1的升级版本,引入了许多新特性。它基于拦截器...
干货:等保2.0安全架构介绍+建设要点.docx干货:等保2.0安全架构介绍+建设要点.docx干货:等保2.0安全架构介绍+建设要点.docx干货:等保2.0安全架构介绍+建设要点.docx干货:等保2.0安全架构介绍+建设要点.docx干货...
标题中的“计算机行业点评:鸿蒙2.0系统正式发布,力推全场景智慧生态”表明了这篇内容主要聚焦在华为发布的鸿蒙2.0操作系统上,以及它对整个计算机行业,尤其是智能设备生态的影响。鸿蒙系统是华为自主开发的操作...
MIDP(Mobile Information Device Profile)2.0是J2ME中的一个重要配置,它提供了在这些小型设备上开发应用程序的基本框架和API。本教程将深入探讨如何使用J2ME和MIDP2.0进行移动应用开发。 **1. J2ME架构** J2ME...
对于开发人员和学习者来说,《ISO/IEC 11889-1:2015 TPM2.0规范2015版01》提供的详细信息将帮助他们理解和应用TPM 2.0的功能,确保软件和硬件设计的安全性。通过深入研究压缩包中的文件`c066510_ISO_IEC_11889-1_...
9. **安全网络机制**:MIDP2.0还包含了安全相关的接口,如数字签名(`javax.microedition.pki`),以确保网络通信的安全性。 移植MIDP2.0到特定的嵌入式系统,如基于ARM架构的设备,通常涉及以下步骤: 1. **硬件...
软件架构设计2.0.docx
4. **Web MVC框架**:Spring 2.0的Web MVC框架提供了一个分层的架构,用于处理Web请求。它支持多种视图技术,如JSP、FreeMarker等,并且通过ModelAndView对象实现了模型与视图的解耦。 5. **Spring Portlet MVC**:...
6. **数据集市**:在DW2.0架构中,数据集市作为特定业务领域的小型数据仓库,提供快速的报表和分析服务。它们可以是星型或雪花型模型,以便于特定用户群体进行高效分析。 7. **实时与流处理**:随着实时数据需求的...
3. **向下兼容**:USB 2.0设计时考虑到了与USB 1.1设备的兼容性,即使在高速模式下,也能与低速或全速的USB 1.1设备正常工作。 4. **分层架构**:USB 2.0采用层次结构,包括主机(Host)、设备(Device)、集线器...
后端技术系列教程,包括: API开发全套教程 后端安全全套教程 后端微服务架构全套教程 后端性能优化全套教程 后端框架全套教程 后端缓存技术全套教程 后端编程语言全套教程 数据库技术全套教程
NGOD2.0的基本架构基于模块化设计,分为多个层次和组件,确保系统的可维护性和可扩展性。它包括前端用户界面、后端业务逻辑处理以及与外部系统的接口,以满足不同服务需求,如内容发布、用户授权、计费和实时数据...
1. **微内核架构**:MINIX2.0采用了微内核设计,其核心仅包含最基本的服务,如进程管理、中断处理和通信机制。其他服务如文件系统、网络协议等都作为独立的用户态进程运行,这种设计提高了系统的稳定性和安全性。 2...
2. 安全性增强:基于微内核的架构设计,鸿蒙2.0提升了系统的安全性,将关键服务隔离在微内核中,降低了安全风险。 3. 开发者友好:提供丰富的开发工具和API,支持Java、JavaScript、Python等多种编程语言,让开发者...
6. **可扩展性**:EXT2.0的API设计得更为完善,更容易进行二次开发和扩展,允许开发者根据需求自定义组件和功能。 7. **性能优化**:针对1.0版本的性能问题,EXT2.0进行了大量优化,包括更快的渲染速度、更少的DOM...
Spring 2.0 是Spring框架的一个重要版本,它在Java企业级应用开发中扮演着核心角色。这个版本引入了许多新特性,增强了框架的功能和灵活性。本文将深入探讨Spring 2.0源代码中的关键知识点,帮助开发者理解其内部...
首先,鸿蒙2.0的分布式架构是其跨越终端鸿沟的关键。不同于传统的操作系统,鸿蒙采用微内核设计,将核心服务模块化,可以灵活地部署在各种设备上,包括手机、电视、汽车甚至智能家居设备。这种设计使得设备间的数据...