知识大全 Factory Method模式在Javamail中的应用
Posted 知
篇首语:水深难见底,虎死不倒威。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Factory Method模式在Javamail中的应用相关的知识,希望对你有一定的参考价值。
Factory Method模式在Javamail中的应用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
设计模式在软件工程中占有重要地位 而JavaMail是Java平台的一个扩展 为管理电子邮件提供了统一的应用编程接口 本文讨论Factory Method设计模式在Javamail中的应用
模式简介
模式的概念最早是出现在城市建筑领域的 lexander的一本关于建筑的书中明确的给出了模式的概念 用来解决在建筑中的一些问题 后来 这个概念逐渐的被计算机科学所采纳 《Design Patterns: Elements of Reusable Object Oriented Sofare》[ ](以下简称《设计模式》)则堪称设计模式领域的经典书籍之一 它开创了软件工程领域的模式化进程
设计模式的简单定义就是对于一类重复出现的问题的可重用的解决方案 在软件工程中一个设计模式解决一类软件设计问题 设计模式中许多方法其实很早就出现了 并且在应用中也比较多 但是直到《设计模式》出来之前 并没有一种统一的认识 或者说 那时候并没有对模式形成一个概念 这些方法还仅仅是处在经验阶段 并没有能够被系统的整理 形成一种理论
每一个设计模式都系统的命名 解释和评价了面向对象系统中的一个重要的和重复出现的设计 这样 我们只要搞清楚这些设计模式 就可以完全或者说很大程度上吸收了那些蕴含在模式中的宝贵的经验 对面向对象的系统能够有更为完善的了解 更为重要的是 这些模式都可以直接用来指导面向对象系统中至关重要的对象建模问题 如果有相同的问题背景 那么很简单 直接套用这些模式就可以了 这可以省去你很多的工作
在《设计模式》一书中涉及到 个模式 被分类为创建型模式(Creational Patterns) 结构型模式(Structural Patterns)和行为模式(Behavioral Patterns) 分别从对象的创建 对象和对象间的结构组合以及对象交互这三个方面为面向对象系统建模方法给予了解析和指导
其中创建型设计模式(Creational Patterns)描述怎样创建一个对象 它隐藏对象创建的细节 使程序代码不依赖具体的对象 这样当我们增加一个新的对象时几乎不需要修改代码 结构型设计模式(Structural Patterns)描述类和对象之间怎么组织起来形成大的结构 主要使用继承来组织接口或实现 行为型设计模式(Behavioral Patterns)描述算法以及对象之间的任务分配 它所描述的不仅仅是对象或类的设计模式 还有它们之间的通讯模式
设计模式在Java中得到了广泛应用 在《Thinking in Java》[ ]一书中 Bruce Eckel介绍了Singleton Prototype Observer Visitor等设计模式在Java中的具体应用和实现 以下将介绍Factory Method设计模式在Javamail中的应用 从中可看出设计模式不仅有助于软件设计 对理解软件结构也很有帮助
Javamail简介
经过几年的发展 Java语言已相当成熟 并在各领域得到广泛应用 特别是J EETM(JavaTM Platform Enterprise Edition)的出现 更是极大地方便了分布式应用程序的创建 作为Java平台的一个扩展 JavaMail 也是J EETM的技术之一 为管理电子邮件提供了统一的应用编程接口(API Application Programming Interface) 它使服务提供者(service providers)可以使用Java语言为它们自己的邮件或消息处理系统提供一致的接口 应用程序可以使用这些一致的接口方便地与这些系统通信
以下是一些Javamail API中的抽象类 由它们可以组成典型的邮件系统
Message 代表一个电子邮件消息
Folder 以分级的形式组织消息 一个Folder可以包含多条消息 多个Folder
Store 代表由邮件服务器 target=_blank>服务器管理的消息数据库 一个具体的Store使用一种特殊的访问协议(如Pop Store使用Pop 协议 IMAPStore使用IMAP协议) 并可包含一个或多个Folder
Transport 代表一个特殊的传输协议 一个具体的Transport使用具体的传输协议发送消息
设计模式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)无关 增强了代码可重用性 因为它独立于用户定义的具体的类
src= //img educity cn/img_ / / / jpg border= ffan= done >
Factory Method在Javamail中的应用
src= //img educity cn/img_ / / / jpg border= ffan= done >
图二指示了Factory Method在Javamail中的应用 其中的类Store相当于图一中的Creator Store的两个子类Pop Store IMAPStore相当于图一中的ConcreteStore 类Folder相当于Product Folder的两个子类Pop Folder和IMAPFolder相当于ConcreteProduct 而Store中的方法getFolder就是一个factory method 由子类Pop Store实例化Pop Folder 由IMAPStore实例化IMAPFolder
类似的图二中的Folder相对于Store来说是Product 但相对于Messsage却也是一个Creator 其方法getMessage同样也是factory method
可重用性
src= //img educity cn/img_ / / / jpg border= ffan= done >
上表是使用Factory Method模式创建对象和直接创建对象的比较 显然前者对于创建不同的对象所用的代码几乎相同 便于代码重用 而后者对于创建不同的对象所用代码就相差很大 想做改动就比较麻烦 若想重用就几乎是不可能的 设计可重用的面向对象软件是十分不易的 恰当地运用设计模式则可在一定程度上解决这个问题
可扩展性
如有一种对应与Pop IMAP的新的邮件协议NewP 则很容易使系统支持这种新的协议 扩展Store建立新类NewPStore 扩展Folder建立新类NewPFolder 扩展Message建立新类NewPMessage 就建立起了新协议的大致框架
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 可以创建多种对象
可重用性
图三中的getStore和getTransport都是Parameterized Factory Method 以getStore为例 给参数以不同的值就能创建不同的对象 例如
Code highlighting produced by Actipro CodeHighlighter (freeware) > Session session = Session getDefaultInstance(props authenticator); Store store = session getStore( pop ); //实例化Pop Store Store store = session getStore( IMAP ); //实例化IMAPStore如上代码所示 通过给出不同的参数 即能实例化不同的对象 其代码重用是相当简单的
可扩展性
若你新建了一个邮件系统 拥有Store的特殊子类NewPStore 此类采用特殊的协议NewP 并已进行了相关设置 如在javamail default providers文件中设置了
Code highlighting produced by Actipro CodeHighlighter (freeware) > protocol = NewP; type = store; class = sun mail IMAP NewPStore; 这样你就可以利用 Session session = Session getDefaultInstance(props authenticator); Store store = session getStore( NewP ); //实例化NewStore创建一个NewPStore型对象
src= //img educity cn/img_ / / / jpg border= ffan= done >
总结
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的一个子类 如上所述创建一个Pop Folder对象必须要有一个Store的子类Pop Store 创建一个IMAPFolder对象必须要有一个Store的子类IMAPStore 而对于Parameterized factory method只需要一个具体的Creator 提供不同的参数就能创建不同的对象 所以可视实际情况在这两者之中取舍 一般原则是 当创建一个具体的Product时确实需要扩展Creator 那么就采用Factory Method 如Pop 和IMAP是两者区别比较大的不同的邮件协议 Pop Store和IMAPStore差异很大 创建Pop Folder确实需要有一个特殊的Store扩展 Pop Store 对于IMAP也一样 此时就需要采用Factory Method模式 而为了创建Pop Store IMAPStore 如还是采用Factory Method模式而分别创建了Session的子类Pop Session IMAPSession 其意义就不是很大 完全是为了创建Pop Store而创建Pop Session Session Pop Session IMAPSession三者代码几乎相同 可以说是一种代码冗余
cha138/Article/program/Java/gj/201311/27598相关参考
知识大全 设计模式(1)Factory模式和Abstract Factory模式
设计模式(1)Factory模式和AbstractFactory模式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
知识大全 JavaScript模式之工厂模式(Factory)应用介绍
JavaScript模式之工厂模式(Factory)应用介绍 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
Factory模式的优点 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
.NET框架中的Factory模式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Factory
.NET框架中的Factory模式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Factory
设计模式在EJB中的应用(下) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Factory模式
php函数method_exists()与is_callable()的区别在哪?在php面相对象设计过程中往往我们需要在调用某一个方法是否属于某一个类的时候做出判断常用的方法有method_exist
创建型模式FACTORY—追MM少不了请吃饭了麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西虽然口味有所不同但不管你带MM去麦当劳或肯德基只管向服务员说来四个鸡翅就行了麦当劳和肯德基就是生产鸡翅的F
IE里Window的Method列表 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! alert(
C#分部方法(PartialMethod)讨论 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C