`
xyheqhd888
  • 浏览: 409254 次
  • 性别: Icon_minigender_1
  • 来自: 秦皇岛
社区版块
存档分类
最新评论

Abstract Factory(抽象工厂)模式

阅读更多

    有时候,我们希望为客户代码提供实例化类的同时能够控制应该对哪个类进行实例化。在这些情况下,我们可以应用Factory Method模式,并提供一个方法来利用某种外部因素确定应该实例化哪个类。有时候,这些用于控制对哪个类进行实例化的外部因素往往涉及多个类,其本身就是一个研究主题。

 

    Abstract Factory模式的意图在于创建一系列相关或相互依赖的对象

 

1. 经典范例:GUI工具包

  GUI工具包是Abstract Factory模式的最经典例子。一个GUI工具包对象就是一个抽象工厂,提供可以搭建客户界面的GUI控件。每个GUI工具包对象可决定按钮、文本字段和其他控件出现的方式。工具包建立明确的“外观和感觉”,包括背景色、图形、以及其他超出工具包所提供控件系列的GUI设计。我们也许会为整个系统建立统一的“外观和感觉”,也许在不同版本中使用不同的“外观和感觉”,以便于区分版本变更、公司标准图形的变更,或者简单的改进。Abstract Factory模式能够实现“外观和感觉”,使得应用程序更加容易学习和使用。如下图所示的UI类就是类似的例子。

 

UI和BetaUI类的实例是从UI控件族创建的抽象工厂

app.abstractFactory目录下的ShowVisualization应用程序从Visualization类在构造器中接收的UI对象中获取其按钮。其图形化界面允许用户在工厂地析上添加和拖放机器。


Visualization类在面板上的左上解添加机器,允许用户使用鼠标拖放机器的位置。用户可以取消拖放或者添加操作 

下图说明了Visualization类:


                                          
                                                       Visualization类借助UI工厂对象构造GUI 

Visualization类使用UI对象来构造GUI。比如,undoButton()方法的代码如下所示:

protected JButton undoButton() 
{ 
if(undoButton == null) 
{ 
undoButton = ui.createButtonCancel();
 undoButton.setText("Undo");
 undoButton.setEnabled(false); 
undoButton.addActionListener(mediator.undoAction); 
} 
return undoButton; 
}

 

  为获取图形化程序的不同“外观和感觉”,我们可以创建一个重写UI工厂类中某些元素的子类。我们可以把这个GUI工厂的实例传递给Visualization类的构造器。

  假设我们发布具备一些新功能的Visualization类,但同时这些代码处于beta测试阶段,用户界面部分可能需要部分调整。举例说,我们希望使用斜体字,并使用cherry-large.gif和cherry-large-down.gif替换掉火箭图形。BetaUI类的代码应该如下所示:

public class BetaUI extends UI 
{ 
public BetaUI() 
{ 
Font oldFont = getFont(); 
font = new Font(oldFont.getName(), oldFont.getStyle() | Font.ITALIC, oldFont.getSize()); 
} 
public JButton createButtonOk() 
{ 
JButton b = super.createButtonOk();
 b.setIcon(getIcon("images/cherry-large.gif"));
 return b; 
}
 public JButton createButtonCancel() 
{ JButton b = super.createButtonCancel();
 b.setIcon(getIcon("images/cherry-large-down.gif")); 
return b; 
} 
}

 

这部分代码采用的策略是尽可能多的使用基础类的方法。

 

运行如下代码,获得新的界面效果:

package app.abstractFactory 
{ 
//... 
public class ShowBetaVisualization 
{ JPanel panel = new Visualization(new BetaUI()); SwingFacade.launch(panel,"Operational Model"); 
} 
}

  

在无需改变Visualization类代码的前提下,借助于BetaUI就可以改变应用程序的界面效果

 

  程序运行之后会获取如图所示的效果。UI和BetaUI类的实例提供不同的GUI控件族,以实现不同的GUI应用程序界面效果。尽管这是Abstract Factory模式的一个非常有价值的应用,但其设计看起来并不健壮。尤其值得注意的是,BetaUI类依赖于这种能力来重写构造过程,以及访问特定受保护的实例变量---尤其是UI类的font变量。

 

突破题:请对上述设计进行修改,仍旧允许开发GUI控件工厂的变种,但是减少子类对UI类的方法修饰符的依赖。

答:提供更灵活设计思路的方案是在接口中指定期望的创建过程以及标准的GUI属性,如下图所示:

GUI控件的抽象工厂设计可以减少子类对UI类中方法修饰符的依赖

 

 当客户需要新对象时,通过使用Abstract Factory模式,客户便无须知道需要实例化哪个类。从这个角度来说,Abstract Factory模式类似于Factory Method模式的集合。在有些情况下,Factory Method模式的设计也许会逐渐演变为Abstract Factory模式的设计。

 

2.抽象工厂和工厂方法

  工厂方法模式介绍了实现CreditCheck接口的两个。当客户调用CreditCheckFactory类的CreatCreditCheck()方法时,CreditCheckFactory类会实例化其中一个类。具体实例化哪个类,取决于赊购代理是否在线。这种设计思路使得其他开发者无需考虑赊购代理的状态。下图了CreditCheckFactory类和CreditCheck接口的当前实现。

 Factory Method模式使得客户可以在进行赊购审查时无须知道需要实例化哪个类

 CreditCheckFactory类提供关于顾客信用卡的赊购代理信息。除此之外,credit包包含查看顾客购买和支付信息的类。下图当前的com.oozinoz.credit包。

本包中的类检查顾客的信用卡、购买地址和支付地址


  现在假设需求分析师告诉你Oozinoz公司希望能够为加拿大的顾客服务。为了把业务扩展到加拿大,你需要使用不同的赊购代理和不同的数据源来获取购买和支付信息。

  当客户给oozinoz公司打电话的时候,呼叫中心应用程序需要一些对象来执行各种检查。具体使用哪些对象取决于呼叫是来自美国还是加拿大。你可以使用Abstract Factory模式来创建这些对象。

  把业务扩展到加拿大后,支持应用程序进行信用检查所需要的类几乎是以前的一倍。假设你使用三个包来维护这些类。现在,credit包中包含三个“检查”接口和一个抽象工厂类。 该抽象工厂类有三个create()方法分别负责创建完成信用、购买和支付等信息的对象。还可以把CreditCheckOffline类放入该包中,这样无论客户是从哪里打来的电话,我们都可以使用该类进行离线验证。下图给出了修改后com.oozinoz.credit包的完整组成结构。

 


经修改后,该类包含主要接口和一个抽象工厂类

  为了使用具体类来实现credit中的接口,可以引入两个新包:com.oozinoz.credit.us和com.oozinoz.credit.ca。每个包都包含了抽象工厂类的具体类,以及实现credit中每个接口的若干类。

 

突破题:下图描述了com.oozinoz.credit.ca包中类及其与credit包中类和接口的关系,请将该图补充完整。 


com.oozinoz.credit.ca包提供一套具体类,用于对加拿大打来的赊购电话进行各种审查

另外,只需从CreditCheckOffline抽象类派生出一个具体的类,因为oozinoz公司离线审查类既可用于处理美国打来的赊购电话,也可用于处理加拿大打来的赊购电话。

 

分别为加拿大客户和美国客户服务的两个具体工厂类都比较简单;它们的返回类型分别是用于加拿大客户的check接口和美国用户的check接口;不过,如果当地赊购代理离线,那么这两个工厂类都将返回CreditCheckOffline对象。CreditCheckFactory类仍可使用Factory Method模式中提到的isAgencyUp()方法来判断赊购代理是否在线。

 

自我突破题:请完成CheckFactoryCanada.java文件中如下所示的代码:

package com.oozinoz.credit.ca;
 import com.oozinoz.credit.*;
 public class CheckFactoryCanada extends CreditCheckFactory 
{ public BillingCheck createBillingCheck() 
{ 
return new BillingCheckCanada(); 
} 
public CreditCheck createCreditCheck() 
{ 
if(isAgencyUp()) return new CreditCheckCanadaOnline();
 return new CreditCheckOffline(); //若代理不在线,则直接返回一个CheckOffline()对象 
} 
public ShippingCheck createShippingCheck() {
 return new ShippingCheckCanada(); 
} 
} 

 

 

一个正确的答案应该包括以下三点:

(1)实现从CreditCheckFactory类继承的create-方法。

(2)拥有每个create-方法返回的合适接口。

(3)如果赊购代理离线,应该返回CreditCheckOffline对象。

 

到现在为止,我们已经通过Abstract Factory模式完成了该设计。该设计可以创建两个不同系列的对象;每个系列的各个对象分别负责验证客户某一方面的信息。这两个对象系列中,一个系列用于美国客户信息验证,另一个系列用于加拿大客户信息验证。抽象类creditCheckFactory的实例将是CheckFactoryCanada类或者是CheckFactoryUS类。这些对象是抽象工厂,能够创建验证不同国家顾客的信用、购买和支付信息的对象。

 

 

3.包和抽象工厂

  从广义上来说,包通常是类的系列;而抽象工厂可以创造对象的系列。在前面所述的例子中,我们将用于加拿大客户的抽象工厂和用于美国客户的抽象工厂分别放在不同的包中,并将这些工厂类产生对象所需的公共接口放在另一个包中。

 

突破题:我们将每个工厂类及相关类放入独立的包中,你认为这样做合理吗?为什么,如果认为不合理,请给出一种你认为合理的做法。

答:赞成方观点:将与每个国家相关的类分别放在不同的包中,这将有利于oozinoz公司的开发人员组织他们的软件和开发工作。因为按照这种方式组织的包相互独立;这样,我们就可以很容易地实现对其他国家的支持。

     反对方观点:这种方式成本太高。有人更愿意将所有类放在同一包中,如果不需要为九个或者更多的国家提供服务项目,那么他们是不会考虑扩展的。在具体的开发环境中,这样做也便于开发人员浏览和对比同一类型的所有类。

 

4. 小结

    Abstract Factory模式可以为客户创建相互关联或相互依赖的对象系列的部分对象。这个模式的最经典范例是“外观和感觉”系列--GUI控件族。当然有的主题超出了这个对象族,诸如顾客的国家。与Factory Method模式一样,Abstract Factory模式使得客户无须知道实例化哪个类。借助于Factory Method模式,可以为客户提供工厂类,每个工厂类都可用于创建一系列与某一公共主题相关的对象。

  • 大小: 3 KB
  • 大小: 1.6 KB
  • 大小: 18.2 KB
  • 大小: 3.2 KB
  • 大小: 14.9 KB
  • 大小: 3.4 KB
  • 大小: 4.8 KB
  • 大小: 5.8 KB
  • 大小: 5 KB
  • 大小: 5 KB
分享到:
评论

相关推荐

    的最全韩顺平php入门到精通全套笔记.doc )

    【PHP入门】 PHP(Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,尤其适用于Web开发,能够嵌入HTML中。本篇笔记基于韩顺平老师的讲解,全面覆盖了从基础到精通的PHP知识体系。 1. **HTML基础** HTML,即超文本标记语言,用于创建网页内容。它包括各种标签来定义网页结构,如`<html>`、`<head>`、`<body>`等。HTML与CSS结合使用,可以实现页面样式控制。HTML5作为最新版本,引入了更多增强功能,如离线存储、拖放功能和媒体元素等。运行HTML有两种方式:本地运行(直接通过浏览器打开文件)和远程访问(通过HTTP协议在服务器上运行)。 2. **动态网页技术** 动态网页能够根据用户输入或服务器状态变化实时更新内容。PHP作为动态网页开发的重要技术之一,具有跨平台、安全性高、效率好、成本低、易于学习和丰富的开源社区支持等优点。PHP可以连接多种数据库,如MySQL,并在PHP4、PHP5和PHP6(及后续版本)中逐。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    花生好坏缺陷识别数据集,7262张图片,支持yolov7格式的标注,识别准确率在95.7%

    花生好坏缺陷识别数据集,7262张图片,支持yolov7格式的标注,识别准确率在95.7% 两种标签: Good,Bad 花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7% 详情查看地址:https://backend.blog.csdn.net/article/details/144983881

    总务科(基建办)2024年工作总结.doc

    总务科(基建办)2024年工作总结.doc

    基于springboot+vue的相亲网站(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    广东省高清卫星地图全图

    广东省高清卫星地图全图

    智能聊天机器人在电商客服领域的应用研究与开发毕业设计报告

    本文聚焦智能聊天机器人于电商客服领域的应用,开篇点明研究背景,剖析电商发展促使客服需求暴增,传统客服乏力,智能机器人应运而生。接着详述电商客服发展脉络、现存痛点,如高峰拥堵、知识滞后、服务同质化等。核心技术涵盖自然语言处理、机器学习、知识图谱,系统采用微服务架构,各模块分工协作。开发流程包括精细调研、多元数据采集、模型选型调优等。创新应用体现于售前精准导购、沉浸式营销,售中订单跟踪、答疑,售后问题处理与回访。经量化指标与用户调研评估成效显著,虽有挑战,但未来借助新技术有望重塑电商服务生态,助力企业与消费者双赢。

    基于springboot+vue的人口老龄化社区服务与管理平台(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    eap2025010741566905-1-1.pdf

    eap2025010741566905-1-1.pdf

    双馈风机MATLAB simulink模型 多个模型打包发送

    双馈风机MATLAB simulink模型 多个模型打包发送

    小熊汉字笔顺学习软件 v2.0

    给小孩找的,看着还不错,分享出来~

    基于springboot+vue的美容院管理系统(Java毕业设计,附源码,部署教程).zip

    该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven

    bcolz-1.2.1-cp38-cp38-win-amd64.whl.rar

    bcolz-1.2.1-cp38-cp38-win-amd64.whl.rar

    自动驾驶技术中域控制单元(DCU)的核心作用与发展前景

    内容概要:本文详尽阐述了自动驾驶技术中的域控制单元(DCU)及其重要性。首先介绍了ADAS(高级驾驶辅助系统)和AD(自动驾驶)的区别和发展现状。接着讨论了域控制单元作为高级ECU,在自动驾驶系统中扮演的重要角色,包括高性能计算、高效的数据处理能力和与其他子系统的紧密配合。文中详细解释了DCU的构成元素——收发器、SoC、MCU和电源管理等模块的工作原理和技术细节,同时也探讨了市场趋势和技术发展趋势,如高集成度、智能化、低功耗等方面。最后展望了DCU在未来域集中式EE架构下的广阔应用前景。 适用人群:从事汽车工程、自动驾驶技术和嵌入式软件开发的专业技术人员,以及对此领域感兴趣的科研工作者。 使用场景及目标:①帮助开发者深入了解自动驾驶系统组成尤其是DCU的设计理念和技术特征;②指导相关领域的研究者把握当前行业发展动态和技术前沿。 其他说明:本文不仅深入浅出地讲解了专业知识,而且引用了一些作者个人感悟的文字,增加了可读性和启发性。

    Java与Python编程语言特性、应用场景及其学习选择

    内容概要:文章主要介绍了Java和Python这两种流行的编程语言之间的区别和联系。首先详细讲述了Java的基本特性,包括跨平台性、面向对象编程、类型安全、自动化内存管理和多线程支持等特点,并概述了其在企业级开发中的广泛应用。接着深入探讨了Python的特点,指出它的简明语法、灵活性以及丰富的生态体系,特别提到了其在数据分析、人工智能等前沿领域的优势。文中还比较了两者的应用场景和技术实现方式的不同之处。最后为初学者提出了基于个人职业发展目标来选择编程语言的建议。 适合人群:对编程有兴趣的学生、编程新手以及想要转换编程方向的技术人员。 使用场景及目标:有助于读者理解两种编程语言各自的优劣,便于在实际工作中或者个人兴趣发展中做出明智的选择。 其他说明:通过对比讲解,不仅展示了两种编程语言的共同点,还强调了它们各自独特的优势所在。这有助于加深读者对其本质特征的认识,从而更好地应对不同类型的编程任务和挑战。

    Java 飞机订票系统实训报告

    Java 飞机订票系统实训报告,有数据库

    easy-interceptor修改请求头和响应头.zip

    easy-interceptor修改请求头和响应头.zip

    Python身份证识别系统源码(精准度非常高).zip

    Python身份证识别系统源码(精准度非常高).zip,个人大三大作业设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 Python身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系统源码(精准度非常高).zipPython身份证识别系

    【电磁】基于matlab微带线中的电势和场分布【含Matlab源码 10949期】.zip

    Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    一个利用深度学习模型(LSTM 网络)对电商用户咨询文本进行意图分类的python源码

    功能:利用深度学习模型(LSTM 网络)对电商用户咨询文本进行意图分类,相比简单规则匹配,能处理更复杂、语义模糊的文本,精准识别用户需求。 技术要点:使用 TensorFlow 构建 LSTM 模型,包括文本预处理将文本数字化,Embedding 层将数字映射为向量,LSTM 层捕捉序列特征,Dense 层输出分类结果,通过训练优化模型参数,实现准确意图识别。

    国产银河麒麟V10和统信系统(linux)没有root用户的解决办法

    国产银河麒麟V10和统信系统(linux)没有root用户的解决办法。如何在没有root用户的情况下,开通和启用root用户

Global site tag (gtag.js) - Google Analytics