`
zhishan332
  • 浏览: 14335 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Factory Method模式在Javamail中的应用(转)

 
阅读更多

简介: 设计模式在软件工程中占有重要地位,而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中的抽象类,由它们可以组成典型的邮件系统:

1.Message-代表一个电子邮件消息。
2.Folder-以分级的形式组织消息。一个Folder可以包含多条消息、多个Folder。
3.Store-代表由邮件服务器管理的消息数据库,一个具体的Store使用一种特殊的访问协议(如Pop3Store使用Pop3协议,IMAPStore使用IMAP协议),并可包含一个或多个Folder。
4.Transport-代表一个特殊的传输协议,一个具体的Transport使用具体的传输协议发送消息。

--------------------------------------------------------------------------------
3、设计模式Factory Method

此模式属于创建型设计模式,它只定义创建对象的接口,而由它的子类负责创建具体的对象,利用子类实例化不同的对象。图一是Factory Method 模式结构的类图(Class Diagram),其中:

1.Product 定义了由factory method所创建对象的统一接口。
2.ConcreteProduct 具体的类,实现Product接口。
3.Creator 一般为抽象类,声明若干factory method(方法),由它创建类型为Product的对象。正因为它能"生产"对象,所以称为factory method。Creator也可能拥有一个方法创建某个缺省的具体对象。
4.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为例,给参数以不同的值就能创建不同的对象。例如:

Session session = Session.getDefaultInstance(props, authenticator);
Store store1 = session.getStore("pop3");  //实例化Pop3Store
Store store2 = session.getStore("IMAP");  //实例化IMAPStore




如上代码所示,通过给出不同的参数,即能实例化不同的对象,其代码重用是相当简单的。

5.2可扩展性

若你新建了一个邮件系统,拥有Store的特殊子类NewPStore,此类采用特殊的协议NewP,并已进行了相关设置,如在javamail.default.providers文件中设置了:

protocol = NewP; type = store; class = com.sun.mail.IMAP.NewPStore;
这样你就可以利用

Session session = Session.getDefaultInstance(props, authenticator);
Store store = session.getStore("NewP");  //实例化NewStore




创建一个NewPStore型对象。




--------------------------------------------------------------------------------
6、总结

Factory Method及其变异Parameterized factory method 都是极为常用的设计模式。在Javamail中还有许多地方使用了Factory Method或Parameterized Factory Method,比如类Session中的方法getProvider、getFolder也是Parameterized Factory Method, getInstance也可以算是Parameterized Factory Method,不过它比较特殊,它实例化Session自身。而且两者都很容易实现代码重用,进行系统扩展。

但Factory Method模式和Parameterized factory method略有不同。对于Factory Method,有一个潜在的不利因素,那就是为了创建一个特殊的对象,必须有相应于Creator的一个子类。如上所述创建一个Pop3Folder对象必须要有一个Store的子类Pop3Store, 创建一个IMAPFolder对象必须要有一个Store的子类IMAPStore。而对于Parameterized factory method只需要一个具体的Creator,提供不同的参数就能创建不同的对象。所以可视实际情况在这两者之中取舍。一般原则是:当创建一个具体的Product时确实需要扩展Creator,那么就采用Factory Method,如Pop3和IMAP是两者区别比较大的不同的邮件协议,Pop3Store和IMAPStore差异很大,创建Pop3Folder确实需要有一个特殊的Store扩展--Pop3Store,对于IMAP也一样,此时就需要采用Factory Method模式。而为了创建Pop3Store、IMAPStore,如还是采用Factory Method模式而分别创建了Session的子类Pop3Session、IMAPSession,其意义就不是很大,完全是为了创建Pop3Store而创建Pop3Session,Session、Pop3Session、IMAPSession三者代码几乎相同,可以说是一种代码冗余。

总之应该视具体情况应用适当的设计模式,才能充分发挥设计模式应有的作用。



参考资料

•Design Pattern: Elements of Reusable Object-Oriented Software, by Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides,1995,Addison-Wesley Pub Co;


•JavaMail TM API Design Specification, Version 1.2, Sun Microsystems, Inc.


•Thinking in Java, by Bruce Eckel,1998,Prentice Hall Computer Books


关于作者

作者:吴慧良,男,硕士研究生,主攻软件工程,分布式应用程序设计。E-mail: yellowair@icqmail.com

 

分享到:
评论

相关推荐

    JavaMail组件简单应用

    本文将深入探讨JavaMail的核心概念、主要组件以及如何在实际项目中进行简单应用。 1. **JavaMail API概述** JavaMail API是Java平台上的一个开源库,由JavaMail项目维护,用于处理邮件服务。它包括了SMTP(Simple ...

    javamail 中文API文档

    ### JavaMail API中文文档知识点...JavaMail API为开发者提供了一套全面的工具集,使得在Java应用程序中集成电子邮件功能变得简单。通过理解上述核心概念及其用法,开发者可以轻松地开发出功能完善的电子邮件应用程序。

    javamail(带界面的javamail)

    JavaMail 是一个强大的开源库,用于在Java应用程序中实现电子邮件的发送和接收功能。它提供了丰富的API,使得开发者能够方便地处理SMTP、POP3、IMAP等邮件协议,支持多种邮件格式,包括文本、HTML以及带有附件的邮件...

    JavaMail-1.5 API

    JavaMail提供了一系列用于处理电子邮件的类和接口,允许开发者在Java应用程序中集成邮件发送和接收功能。 在1.5版本中,JavaMail API新增了一些功能特性,并对一些接口和实现进行了改进。作为一个官方API,它由Sun ...

    JavaMail 1.6.0 Final Release

    JavaMail 是一个开源的 Java API,它为开发者提供了在 Java 应用程序中发送和接收电子邮件的能力。这个“JavaMail 1.6.0 Final Release”是 JavaMail 的一个重要版本,它包含了对 SMTP(简单邮件传输协议)、IMAP...

    javamail 所有jar包

    JavaMail 是一个开源的 Java API,它为开发者提供了在 Java 应用程序中发送和接收电子邮件的功能。这个API包括了多种协议的支持,如SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)。在...

    javamail的jar包:javamail-1.6

    JavaMail 是一个开源库,用于在Java应用程序中处理电子邮件。这个库提供了丰富的API,使得开发者可以方便地执行发送、接收、读取和管理邮件的任务。`javamail-1.6`是JavaMail的一个版本,它包含了从早期版本中继承的...

    javamail详例与帮助文档

     虽然JavaMail是Sun的API之一,但它目前还没有被加在标准的java开发工具包中(Java Development Kit),这就意味着你在使用前必须另外下载JavaMail文件。除此以外,你还需要有Sun的JavaBeans Activation Framework ...

    javamail附件从流中获取

    JavaMail 是一个开源库,用于在Java应用程序中发送和接收电子邮件。它提供了丰富的API,使得开发者可以方便地处理复杂的邮件操作,包括添加附件、设置HTML内容等。在"javamail附件从流中获取"这个主题中,我们将深入...

    javamail.pdf

    JavaMail 是 Java EE 中的一个标准 API,广泛应用于企业级应用程序中。 EmailData 类 在 JavaMail 中,EmailData 类是一个重要的数据结构类,用于封装邮件的各种属性,如发件人、收件人、邮件主题、邮件内容、邮件...

    javamail发送邮件实例

    JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。这个库提供了一组API,使得开发者能够轻松地处理SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)等邮件服务。在...

    JavaMail+JAF+JavaMail_API+JavaMail_API详解

    在JavaMail中,JAF被用来解析和操作邮件中的复杂数据结构,如带有附件或嵌入图片的邮件。jaf-1_1_1.zip文件包含了JAF的1.1.1版本,可能包括了库文件、API文档和其他相关资源。 JavaMail API documentation.rar可能...

    javamail.jar,javamail资源包

    `javamail.jar` 文件是JavaMail的核心库,包含了所有必要的类和接口,使得开发者可以在他们的应用程序中集成邮件功能。 在JavaMail中,有几个关键的概念和组件: 1. **Session**: 这是JavaMail中的顶级对象,代表...

    javaMail基本应用

    这个API遵循了 Internet 标准,如 SMTP(简单邮件传输协议)、POP3(邮局协议版本3)和 IMAP(因特网消息访问协议),使得在 Java 应用程序中集成邮件功能变得简单。 标题 "javaMail基本应用" 涉及到的知识点主要...

    JavaMail相关Jar包

    JavaMail 是一个开源的Java库,它为Java程序员提供了发送、接收和操作电子邮件的强大功能。在Java应用程序中发送...它们提供了一套完整的API,使得开发者无需深入了解底层邮件协议,即可轻松地在应用中集成邮件功能。

    JavaMail邮件发送源码 非常简单

    JavaMail是一种在Java应用程序中发送和接收电子邮件的标准API,它为开发者提供了强大的功能,使得处理邮件变得简单而高效。在JavaMail中,我们主要利用 javax.mail 和 javax.mail.internet 这两个包中的类来实现邮件...

    javamail问题及解决方案

    然而,在实际应用中,JavaMail经常会遇到各种问题,比如连接失败、身份验证错误等。本文将基于一个具体的JavaMail示例代码,探讨在使用JavaMail过程中常见的问题及其解决方案。 #### 一、连接问题 在JavaMail示例...

    封装javamail

    JavaMail 是一个开源库,用于在Java应用程序中处理电子邮件。这个封装javamail的项目旨在简化邮件发送和接收的过程,通过提供自定义的接口和类,使得开发者可以更方便地利用JavaMail API。 首先,我们需要了解...

    使用jsp实现javaMail邮箱功能开发

    本项目旨在利用JSP和JavaMail API实现在Web应用中发送邮件的功能,主要涉及POP3协议。下面将详细阐述这个过程中的关键知识点。 1. JSP基础: JSP是Java平台上的服务器端脚本语言,它允许开发者在HTML页面中嵌入...

Global site tag (gtag.js) - Google Analytics