首页 | 邮件资讯 | 技术教程 | 解决方案 | 产品评测 | 邮件人才 | 邮件博客 | 邮件系统论坛 | 软件下载 | 邮件周刊 | 热点专题 | 工具
网络技术 | 操作系统 | 邮件系统 | 客户端 | 电子邮箱 | 反垃圾邮件 | 邮件安全 | 邮件营销 | 移动电邮 | 邮件软件下载 | 电子书下载

邮件服务器

技术前沿 | Qmail | IMail | MDaemon | Exchange | Domino | 其它 | Foxmail | James | Kerio | JavaMail | WinMail | Sendmail | Postfix | Winwebmail | Merak | CMailServer | 邮件与开发 | 金笛 |
首页 > 邮件服务器 > JavaMail > Factory Method模式在Javamail中的应用 > 正文

Factory Method模式在Javamail中的应用

出处:IT168 作者:IT168 时间:2009-2-27 14:12:31
设计模式在软件工程中占有重要地位,而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中的抽象类,由它们可以组成典型的邮件系统:

  Message-代表一个电子邮件消息。

  Folder-以分级的形式组织消息。一个Folder可以包含多条消息、多个Folder。

  Store-代表由邮件服务器管理的消息数据库,一个具体的Store使用一种特殊的访问协议(如Pop3Store使用Pop3协议,IMAPStore使用IMAP协议),并可包含一个或多个Folder。

  Transport-代表一个特殊的传输协议,一个具体的Transport使用具体的传输协议发送消息。

  3、设计模式Factory Method

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

  Product 定义了由factory method所创建对象的统一接口。

  ConcreteProduct 具体的类,实现Product接口。

  Creator 一般为抽象类,声明若干factory method(方法),由它创建类型为Product的对象。正因为它能"生产"对象,所以称为factory method。Creator也可能拥有一个方法创建某个缺省的具体对象。

  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为例,给参数以不同的值就能创建不同的对象。例如:

1 Session session = Session.getDefaultInstance(props, authenticator);
2
3   Store store1 = session.getStore("pop3"); //实例化Pop3Store
4
5   Store store2 = session.getStore("IMAP"); //实例化IMAPStore
6
7

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

  5.2可扩展性

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

1 protocol = NewP; type = store; class = com.sun.mail.IMAP.NewPStore;
2
3   这样你就可以利用
4
5   Session session = Session.getDefaultInstance(props, authenticator);
6
7   Store store = session.getStore("NewP"); //实例化NewStore
8
9

  创建一个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三者代码几乎相同,可以说是一种代码冗余。

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

相关文章 热门文章
  • JavaMail常见问题之安装和配置问题解答
  • 通过JavaMail访问Hotmail邮箱
  • JavaMail之POP3协议判断新邮件的思路
  • JavaMail实现邮件特快专递
  • JavaMail 之 杜绝邮件乱码
  • 利用JavaMail收/发Gmail邮件(SSL)
  • Javamail处理unicode-1-1-utf-7编码的邮件
  • 用javamail收取hotmail的退信
  • 简化JavaMail:小巧 Jakarta Commons-Email
  • JavaMail API细节详细解析大全
  • Javamail的开发与应用总结经验之二
  • Javamail的开发与应用总结经验之一
  • 在JSP中使用JavaMail
  • 通过JavaMail访问Hotmail邮箱
  • JavaMail API细节详细解析大全
  • 利用JavaMail收/发Gmail邮件(SSL)
  • JavaMail之POP3协议判断新邮件的思路
  • javamail发送邮件
  • javamail写的解析MimeMessage的程序
  • Javamail的开发与应用总结经验之一
  • JavaMail实现邮件特快专递
  • Javamail操作指南:实例代码解析
  • JavaMail 之 杜绝邮件乱码
  • 简化JavaMail:小巧 Jakarta Commons-Email
  • 自由广告区
     
    最新软件下载
  • SharePoint Server 2010 部署文档
  • Exchange 2010 RTM升级至SP1 教程
  • Exchange 2010 OWA下RBAC实现的组功能...
  • Lync Server 2010 Standard Edition 标..
  • Lync Server 2010 Enterprise Edition...
  • Forefront Endpoint Protection 2010 ...
  • Lync Server 2010 Edge 服务器部署文档
  • 《Exchange 2003专家指南》
  • Mastering Hyper-V Deployment
  • Windows Server 2008 R2 Hyper-V
  • Microsoft Lync Server 2010 Unleashed
  • Windows Server 2008 R2 Unleashed
  • 今日邮件技术文章
  • 腾讯,在创新中演绎互联网“进化论”
  • 华科人 张小龙 (中国第二代程序员 QQ...
  • 微软推出新功能 提高Hotmail密码安全性
  • 快压技巧分享:秒传邮件超大附件
  • 不容忽视的邮件营销数据分析过程中的算..
  • 国内手机邮箱的现状与未来发展——访尚..
  • 易观数据:2011Q2中国手机邮箱市场收入..
  • 穿越时空的爱恋 QQ邮箱音视频及贺卡邮件
  • Hotmail新功能:“我的朋友可能被黑了”
  • 入侵邻居网络发骚扰邮件 美国男子被重..
  • 网易邮箱莫子睿:《非你莫属》招聘多过..
  • 中国电信推广189邮箱绿色账单
  • 最新专题
  • 鸟哥的Linux私房菜之Mail服务器
  • Exchange Server 2010技术专题
  • Windows 7 技术专题
  • Sendmail 邮件系统配置
  • 组建Exchange 2003邮件系统
  • Windows Server 2008 专题
  • ORF 反垃圾邮件系统
  • Exchange Server 2007 专题
  • ISA Server 2006 教程专题
  • Windows Vista 技术专题
  • “黑莓”(BlackBerry)专题
  • Apache James 专题
  • 分类导航
    邮件新闻资讯:
    IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮
    电子邮箱 | 反垃圾邮件|邮件客户端|网络安全
    行业数据 | 邮件人物 | 网站公告 | 行业法规
    网络技术:
    邮件原理 | 网络协议 | 网络管理 | 传输介质
    线路接入 | 路由接口 | 邮件存储 | 华为3Com
    CISCO技术 | 网络与服务器硬件
    操作系统:
    Windows 9X | Linux&Uinx | Windows NT
    Windows Vista | FreeBSD | 其它操作系统
    邮件服务器:
    程序与开发 | Exchange | Qmail | Postfix
    Sendmail | MDaemon | Domino | Foxmail
    KerioMail | JavaMail | Winwebmail |James
    Merak&VisNetic | CMailServer | WinMail
    金笛邮件系统 | 其它 |
    反垃圾邮件:
    综述| 客户端反垃圾邮件|服务器端反垃圾邮件
    邮件客户端软件:
    Outlook | Foxmail | DreamMail| KooMail
    The bat | 雷鸟 | Eudora |Becky! |Pegasus
    IncrediMail |其它
    电子邮箱: 个人邮箱 | 企业邮箱 |Gmail
    移动电子邮件:服务器 | 客户端 | 技术前沿
    邮件网络安全:
    软件漏洞 | 安全知识 | 病毒公告 |防火墙
    攻防技术 | 病毒查杀| ISA | 数字签名
    邮件营销:
    Email营销 | 网络营销 | 营销技巧 |营销案例
    邮件人才:招聘 | 职场 | 培训 | 指南 | 职场
    解决方案:
    邮件系统|反垃圾邮件 |安全 |移动电邮 |招标
    产品评测:
    邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端
    广告联系 | 合作联系 | 关于我们 | 联系我们 | 繁體中文
    版权所有:邮件技术资讯网©2003-2010 www.5dmail.net, All Rights Reserved
    www.5Dmail.net Web Team   粤ICP备05009143号