Java设计模式之抽象工厂模式篇
来源:互联网 发布:java代码调用存储过程 编辑:程序博客网 时间:2024/06/07 06:41
抽象工厂模式是一种比工厂模式抽象程度更高的模式。简而言之,抽象工厂类和工厂类的原理相同,只不过工厂类返回的是普通类的实例;而抽象工厂类返回的是一个工厂类的实例。
抽象工厂类最经典的应用支持多个GUI界面,例如Java的程序同时支持Windows、Motif和Macintosh的界面(这种技术被称为界面类型,look-and-feel)。开发人员可以通过抽象工厂获得某种界面对应的GUI工厂类,通过GUI工厂类开发人员可以对界面上的组件(例如按钮、文本框等)进行操作。从Java 1.2 开始,Java在系统层提供了实现了抽象工厂模式的界面类型。当开发人员在程序中确定界面类型后,就可以通过界面类型获得界面上组件的实例。例如在下面的这段代码中,程序获得操作系统的类型,并根据操作系统设定程序的界面类型:
例子
让我们通过一个简单的例子来看一看抽象工厂模式是如何在应用层被使用的。假设你才买了一套住宅,屋顶有一个花园,而你需要设计一下花园的布局。花园右侧有一个花台,边上需要种一排植物,中心需要种主体植物。根据风格的不同,花园可以被设计为典雅型、使用型和懒人型。
首先我们需要一个Garden类作为基类,通过该类中可以获得花园中种植的植物:
然后我们需要实现Plant类,在该类中保存植物的名称。
在实际的应用中,每种类型的花园对应的植物应该从数据库中查找。在这里为了方便,将每种植物的类型花园对应的植物类型直接写在程序中:
现在我们有了一组Garden的子类,每个子类都实现了同样的方法:getShade(),getCenter()和getBorder()。现在可以通过给抽象工厂类传递特殊的参数获得某一中类型的花园的实例:
运行程序后显示下面的窗口:
在界面中包含了两个部分:左边选择花园的类型。当用户选择了其中一种类型后,程序通过抽象工厂类MakeGarden获得实际的Garden类的实例。
当用户按下"中间"、"墙边"或"花台"的按钮时,程序返回Plant对象,然后通过GardenPanel类将Plant对象的名称显示在界面上:
程序中其他类的软代码如下所示:
小结
使用抽象工厂模式的一个主要原因是由于它能够将实现类和它们的生成过程完全分割开来。实现类被隐藏在工厂类中,调用者不必知道实现类的任何信息。由于这种特性,开发人员也很容易在一组实现类中进行替换。虽然抽象工厂中的子类继承了同一个基类,但是它们也可以拥有与其他子类不同的方法。例如在ElegantGarden类中,我们可以加上花架和假山的属性以及获得这两个属性的方法;而在其他的花园类中则不需要包含这两个属性。当然在程序中需要判断当前的实例是否支持这些特殊的方法,解决的方案有两种:一种是将包含特殊方法在内的所有的方法都定义在基类中,只有支持特殊方法的类才实现这些特殊方法;另一种方案是在抽象类中判断实现类的类型:
抽象工厂类最经典的应用支持多个GUI界面,例如Java的程序同时支持Windows、Motif和Macintosh的界面(这种技术被称为界面类型,look-and-feel)。开发人员可以通过抽象工厂获得某种界面对应的GUI工厂类,通过GUI工厂类开发人员可以对界面上的组件(例如按钮、文本框等)进行操作。从Java 1.2 开始,Java在系统层提供了实现了抽象工厂模式的界面类型。当开发人员在程序中确定界面类型后,就可以通过界面类型获得界面上组件的实例。例如在下面的这段代码中,程序获得操作系统的类型,并根据操作系统设定程序的界面类型:
|
让我们通过一个简单的例子来看一看抽象工厂模式是如何在应用层被使用的。假设你才买了一套住宅,屋顶有一个花园,而你需要设计一下花园的布局。花园右侧有一个花台,边上需要种一排植物,中心需要种主体植物。根据风格的不同,花园可以被设计为典雅型、使用型和懒人型。
首先我们需要一个Garden类作为基类,通过该类中可以获得花园中种植的植物:
|
然后我们需要实现Plant类,在该类中保存植物的名称。
|
在实际的应用中,每种类型的花园对应的植物应该从数据库中查找。在这里为了方便,将每种植物的类型花园对应的植物类型直接写在程序中:
|
现在我们有了一组Garden的子类,每个子类都实现了同样的方法:getShade(),getCenter()和getBorder()。现在可以通过给抽象工厂类传递特殊的参数获得某一中类型的花园的实例:
|
运行程序后显示下面的窗口:
在界面中包含了两个部分:左边选择花园的类型。当用户选择了其中一种类型后,程序通过抽象工厂类MakeGarden获得实际的Garden类的实例。
|
当用户按下"中间"、"墙边"或"花台"的按钮时,程序返回Plant对象,然后通过GardenPanel类将Plant对象的名称显示在界面上:
|
程序中其他类的软代码如下所示:
|
使用抽象工厂模式的一个主要原因是由于它能够将实现类和它们的生成过程完全分割开来。实现类被隐藏在工厂类中,调用者不必知道实现类的任何信息。由于这种特性,开发人员也很容易在一组实现类中进行替换。虽然抽象工厂中的子类继承了同一个基类,但是它们也可以拥有与其他子类不同的方法。例如在ElegantGarden类中,我们可以加上花架和假山的属性以及获得这两个属性的方法;而在其他的花园类中则不需要包含这两个属性。当然在程序中需要判断当前的实例是否支持这些特殊的方法,解决的方案有两种:一种是将包含特殊方法在内的所有的方法都定义在基类中,只有支持特殊方法的类才实现这些特殊方法;另一种方案是在抽象类中判断实现类的类型:
|
- java设计模式之抽象工厂模式
- JAVA设计模式之抽象工厂模式
- Java设计模式之抽象工厂模式
- java设计模式之抽象工厂模式
- 【Java设计模式】之抽象工厂模式
- java设计模式 之 抽象工厂模式
- Java--设计模式之抽象工厂模式
- java设计模式之抽象工厂模式
- 设计模式之JAVA----抽象工厂模式
- java设计模式之抽象工厂模式
- java设计模式之抽象工厂模式
- JAVA设计模式之抽象工厂模式
- Java设计模式之抽象工厂模式
- 《Java设计模式》之抽象工厂模式
- Java设计模式之抽象工厂模式
- java设计模式之抽象工厂模式
- JAVA设计模式之抽象工厂模式
- Java设计模式之抽象工厂模式
- Java异常处理之陋习展播
- 在ASP.Net 中使用实现windows登陆的方法. (轉自tainkai的專欄.http://blog.csdn.net/tainkai)
- 工作流经典资料收集
- TreeView&CheckBox(ASP.NET)
- Hibernate深度探险
- Java设计模式之抽象工厂模式篇
- 发现一个好站点,推荐一下 (.net 开源项目)
- Struts需求分析与设计
- 那你说你爱我...
- .net连接池
- 收集Eclipse插件网站 ^_^
- 用键盘控制光标在输入框中跳转的小巧门 (轉自http://blog.csdn.net/dhlhh)
- 盖茨的成功法则
- 一个有趣的查找--搜索最大值所在的ID号 (轉自:http://blog.csdn.net/dhlhh)