论坛首页 Java企业应用论坛

Deep Thinking in Patterns--抽象工厂模式(Abstract Factory)

浏览 3908 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-10  
抽象工厂模式也属于创建模式,也是关于如何创建对象的模式。是对工厂方法模式的拓展延伸。工厂方法模式主要是针对意个产品等级的,更多应用于虚拟构造子类,抽象工厂则可以处理多个产品等级结构。
 
1.抽象工厂模式模式中涉及的角色
   抽象工厂,具体工厂,抽象产品具体产品。
 
2. 抽象工厂模式模式使用的前提
 
1>     有创建一批有相同接口对象的需求
2>     不想暴露太多类的细节给使用者,或者隐藏对象的创建工作
1>       产品包含多于一个的产品族,用工厂方法模式无法解决。其中同一个产品族的产品是在一起使用的。
2>       系统提供一个产品类的库,客户端可以不依赖于实现,做到动态切换产品。
 
一个很经典的例子是,一个支持多视感的界面工具包,不同的视感都包含一些通用的用户UI,如:Button, TextBox,DropDownList,Window等等。客户可以做到动态切换各种风格。其中,那些Button,TextBox,Window,就是抽象产品,而具体的视感界面如WinButton,WinTextBox,WinWindow为具体产品A,UnixButton,UnixTextBox,UnixWindow为具体产品B,具体产品中的A.WinButtonB.UnixButton就被称作产品族。客户需要动态的切换和创建这些视感对象。此时抽象工厂就有用武之地了。
 
下面具个我们程序开发中可能会遇到的例子。比如一个报表系统中的报表格式可能支持PDF,WORD,HTML,EXCEL等格式,我们不想暴露个客户端的具体创建类,并且为今后的扩充格式留下伏笔,如今后可能有XMLReportWriter, TxtReportWriter,ChartReportWriter..等等。实际开发中,可能更加细分,模块化,比如:ReportHeaderCreator, ReportPageHeaderCreator,ReportContextCreator,ReportFooterCreator.而其对于不同的生成格式可能算法完全不同,如html要生成html脚本,word,excel可能要操作office com组件。我们可以把ReportHeader, ReportPage, ,ReportContext, ReportFooter可称一个个产品族,那些xxCreator看作具体工厂,而真正的PDFReportHeader等作为具体产品。遇到这种多产品族的创建情况,可能就需要抽象工厂来发威了。
 
3.抽象工厂模式的优点缺点
优点:
1>      扩充了工厂方法模式,支持多个产品族的创建。
2>      做到了“开-闭”原则。
缺点:
1> 暴露具体工厂
2> 系统架构更加复杂
4.备注
抽象工厂模式是针对多于一个产品族的模式,不要滥用模式,通常抽象工厂可能会与其他模式一起使用,如单例,策略模式等。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics