吴慧良 (yellowair@icqmail.com) 设计模式在软件工程中占有重要地位,而JavaMail是Java平台的一个扩展,为管理电子邮件提供了统一的应用编程接口。本文讨论Factory Method设计模式在Javamail中的应用。 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简介 以下是一些Javamail API中的抽象类,由它们可以组成典型的邮件系统:
3、设计模式Factory Method
也就是说Creator依赖于ConcreteCreator创建Product型的ConcreteProduct对象。 Factory method使应用程序代码只需处理Product接口,而与具体的类(ConcreteProduct)无关,增强了代码可重用性,因为它独立于用户定义的具体的类。 图二指示了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 可扩展性 5、Parameterized Factory Method在Javamail中的应用 在Javamail中有一个final static类Session,不能创建它的子类,通过此类设置和访问一些特殊的属性,另外此类还拥有若干Parameterized Factory Method,可以创建多种对象。 5.1可重用性
5.2可扩展性
6、总结 但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三者代码几乎相同,可以说是一种代码冗余。 总之应该视具体情况应用适当的设计模式,才能充分发挥设计模式应有的作用。
|
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21359667/viewspace-588764/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21359667/viewspace-588764/