分享
 
 
 

架构性宣言: MIDP 2.0 中的工厂设计模式

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

手机开发人员通常使用 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,我将帮助您更好地理解它。关于工厂模式本身,您已经了解了一些知识:即它的工作方式和它最适合解决哪类问题。请继续关注下个月的专栏,我们将介绍在为下一个手机开发项目选择技术时可以使用的实践技巧。

(出处:http://www.knowsky.com)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有