工厂方法设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。

在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !

目录

1.简介 2.什么是工厂方法模式 3.实施工厂方法模式 4.何时使用工厂方法模式 5. JDK中的工厂方法模式 6.下载源代码

1.简介

在当今的现代世界中,每个人都在使用软件来促进其工作。 最近,一家产品公司改变了他们过去从客户那里接订单的方式。 该公司现在正在寻找使用应用程序从他们那里接订单的方法。 他们以XML格式接收订单,订单错误,前一订单的反馈以及对该订单的响应。 该公司已要求您开发一个应用程序以解析XML并将结果显示给他们。

您面临的主要挑战是解析XML并将其内容显示给用户。 根据公司从客户那里收到的不同消息类型,有不同的XML格式。 例如,与响应或错误XML相比,订单类型XML具有不同的xml标签集。 但是核心工作是相同的。 也就是说,向用户显示这些XML中携带的消息。

尽管核心工作是相同的,但根据应用程序从用户那里获得的XML的类型,将使用的对象也有所不同。 因此,应用程序对象可能只知道它需要从类层次结构(不同解析器的层次结构)内访问一个类,但不确切知道要从父类的子类集合中选择哪个类。

在这种情况下,最好提供一个工厂,即一个创建解析器的工厂,并根据应用程序从用户那里接收到的XML的类型,在运行时实例化解析器来完成这项工作。

适合这种情况的Factory Method Pattern定义了一个用于创建对象的接口,但是让子类决定要实例化哪个类。 Factory Method使类将实例化延迟到子类。

让我们看到有关Factory Method Pattern的更多详细信息,然后将使用它来为应用程序实现XML解析器。

2.什么是工厂方法模式

工厂方法模式为我们提供了一种封装具体类型的实例的方法。 Factory Method模式封装了在称为工厂方法的指定方法内部选择和实例化适当类所需的功能。 工厂方法根据应用程序上下文和其他影响因素从类层次结构中选择适当的类。 然后,它实例化选定的类,并将其作为父类类型的实例返回。

这种方法的优点是应用程序对象可以利用工厂方法来访问适当的类实例。 这样就不需要应用程序对象来处理变化的类选择标准。

图1

图1

产品

  • 定义工厂方法创建的对象的接口。

混凝土产品

  • 实现产品接口。

创作者

  • 声明工厂方法,该方法返回产品类型的对象。 创建者还可以定义工厂方法的默认实现,该方法返回默认的ConcreteProduct对象。
  • 可以调用工厂方法来创建一个Product对象。

ConcreteCreator

  • 重写factory方法以返回ConcreteProduct的实例。

工厂方法消除了将特定于应用程序的类绑定到代码中的需要。 该代码仅处理Product接口; 因此,它可以与任何用户定义的ConcreteProduct类一起使用。

3.实施工厂方法模式

为了实现如上所述的应用程序解决方案,让我们首先检查一下我们拥有的产品。

package com.javacodegeeks.patterns.factorymethodpattern;public interface XMLParser {public String parse();}

上面的接口将由不同的XML解析器使用。

package com.javacodegeeks.patterns.factorymethodpattern;public class ErrorXMLParser implements XMLParser{@Overridepublic String parse() {System.out.println("Parsing error XML...");return "Error XML Message";}}

ErrorXMLParser实现XMLParser ,并用于解析错误消息XML。

package com.javacodegeeks.patterns.factorymethodpattern;public class FeedbackXML implements XMLParser{@Overridepublic String parse() {System.out.println("Parsing feedback XML...");return "Feedback XML Message";}}

上面的类用于解析反馈消息XML。

其他XML解析器是:

package com.javacodegeeks.patterns.factorymethodpattern;public class OrderXMLParser implements XMLParser{@Overridepublic String parse() {System.out.println("Parsing order XML...");return "Order XML Message";}}package com.javacodegeeks.patterns.factorymethodpattern;public class ResponseXMLParser implements XMLParser{@Overridepublic String parse() {System.out.println("Parsing response XML...");return "Response XML Message";}}

为了显示来自解析器的解析消息,创建了一个抽象服务类,该类将通过特定于服务(即特定于解析器)的显示类进行扩展。

package com.javacodegeeks.patterns.factorymethodpattern;public abstract class DisplayService {public void display(){XMLParser parser = getParser();String msg = parser.parse();System.out.println(msg);}protected abstract XMLParser getParser();}

上面的类用于向用户显示由XML解析器获取的消息。 上面的类是一个抽象类,其中包含两个重要的方法。 display方法用于向用户显示消息。 getParser方法是工厂方法,由子类实现以实例化解析器对象,而display方法使用该方法来解析XML并获取要显示的消息。

下面是实现getParser方法的DisplayService的子类。

package com.javacodegeeks.patterns.factorymethodpattern;public class ErrorXMLDisplayService extends DisplayService{@Overridepublic XMLParser getParser() {return new ErrorXMLParser();}}
package com.javacodegeeks.patterns.factorymethodpattern;public class FeedbackXMLDisplayService extends DisplayService{@Overridepublic XMLParser getParser() {return new FeedbackXML();}}
package com.javacodegeeks.patterns.factorymethodpattern;public class OrderXMLDisplayService extends DisplayService{@Overridepublic XMLParser getParser() {return new OrderXMLParser();}}
package com.javacodegeeks.patterns.factorymethodpattern;public class ResponseXMLDisplayService extends DisplayService{@Overridepublic XMLParser getParser() {return new ResponseXMLParser();}}

现在,让我们测试一下工厂方法。

package com.javacodegeeks.patterns.factorymethodpattern;public class TestFactoryMethodPattern {public static void main(String[] args) {DisplayService service = new FeedbackXMLDisplayService();service.display();service = new ErrorXMLDisplayService();service.display();service = new OrderXMLDisplayService();service.display();service = new ResponseXMLDisplayService();service.display();}}

上面的类产生以下输出:

Parsing feedback XML...
Feedback XML Message
Parsing error XML...
Error XML Message
Parsing order XML...
Order XML Message
Parsing response XML...
Response XML Message

在上面的类中,您可以清楚地看到通过让子类实现factory方法可以创建解析器的不同实例,这些实例可以根据需要在运行时使用。

4.何时使用工厂方法模式

在以下情况下使用“工厂方法”模式

  • 类无法预期必须创建的对象的类。
  • 一个类希望其子类指定其创建的对象。
  • 类将责任委派给几个帮助程序子类之一,并且您想定位哪个帮助程序子类是委托的知识。

5. JDK中的工厂方法模式

以下是JDK中工厂方法模式的用法。

  • java.util.Calendar#getInstance()
  • java.util.ResourceBundle#getBundle()
  • java.text.NumberFormat#getInstance()
  • java.nio.charset.Charset#forName()
  • java.net.URLStreamHandlerFactory#createURLStreamHandler(String) (根据协议返回单例对象)

6.下载源代码

这是关于“工厂方法模式”的课程。 您可以在此处下载源代码:
FactoryMethodPattern-项目

翻译自: https://www.javacodegeeks.com/2015/09/factory-method-design-pattern.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmx jolokia_使用Jolokia和JMX进行客户端服务器监视

jmx jolokiaJava监视工具的选择非常广泛(由Google提供的随机选择和顺序): javamelody 压力探头 JVisualVM 控制台 贾蒙 Java JMX Nagios插件不适用 此外,还有各种专用工具,例如ActiveMQ , JBoss &…

利用 %20 替换 空格

将字符串中的空格都替换为 %20 &#xff08; 时间复杂度为O&#xff08;N&#xff09;的解法 &#xff09; void ReplaceBlankSpace(char* arr){if (arr){int count 0;int lenth strlen(arr);for (int i 0; i < lenth;i)if (arr[i] )count;char*before arrlenth, *beh…

Node.js 官方文档中文版

这目录也是醉了 。 列出跟没列出没两样 转载于:https://www.cnblogs.com/ganmk--jy/p/5646860.html

Smaug Coverage

转载于:https://www.cnblogs.com/edisonxiang/p/5650656.html

图谱(学习地图)系列总结,持续更新中

目录 1.2022年最新前端学习路线图 2.2022年最新大数据学习路线图 3.2022年最新javaEE学习路线图 4.2022年最新UI/UE学习路线图 5.2022年java学习路线指南 6.JavaScript学习总结&#xff08;思维导图篇&#xff09; 7.思维脑图——数据分析实战&#xff08;最新版&#…

ccxt k线数据_寻找相似的历史k线

有网友提问应该用什么样的数据库/数据结构/算法来计算某支股票的相似K线? 具体的问题描述是&#xff0c;假设给出某股某段行情K线&#xff08;单位/日&#xff09;&#xff0c;从任何其他股票历史中匹配出与之最为相似的某段历史K线&#xff0c;并给出相似度值&#xff08;单位…

k均值例子 数据挖掘_数据挖掘的技术有很多种,常用的数据挖掘技术就这13种...

数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的数据中&#xff0c;提取隐含在其中的、人们事先不知道的但又是潜在有用的信息和知识的过程。数据挖掘的任务是从数据集中发现模式&#xff0c;可以发现的模式有很多种&#xff0c;按功能可以分为两大类&#xff1a;预…

【TypeScript系列教程05】保留关键字

目录 TypeScript 保留关键字 TypeScript 保留关键字 TypeScript 保留关键字如下表所示&#xff1a;

中国剩余定理 互质与非互质版本

中国剩余定理互质版 设m1&#xff0c;m2&#xff0c;m3&#xff0c;...&#xff0c;mk是两两互素的正整数&#xff0c;即gcd(mi,mj)1&#xff0c;i!j&#xff0c;i,j1,2,3,...,k. 则同余方程组&#xff1a; x a1 (mod n1) x a2 (mod n2) ... x ak (mod nk) 模[n1,n2,...nk]有…

aix 的c库为什么都是静态库_卢卡库:若梅罗、莱万都在努力突破极限,为什么我不能做到呢...

直播吧12月8日讯 北京时间周四凌晨的欧冠小组赛末轮比赛&#xff0c;国米将在主场迎战顿涅茨克矿工。目前&#xff0c;蓝黑军团依然保留着些许出线希望。在这场比赛之前&#xff0c;国米射手卢卡库接受了《法国足球》的采访&#xff0c;他谈论了和孔蒂的关系、和劳塔罗的搭档以…

便携式不锈钢管道焊接机器人_304不锈钢管居然可以发黑?

大家好&#xff0c;我是圣联达不锈钢管材管件孙立成。今天有伙伴们问我&#xff0c;自己使用的304不锈钢管表面怎么发黑了。带着这个问题&#xff0c;今天我特意去梳理了有关304发黑的缘故及其解决方法。304不锈钢管实际上按照正常生产流程&#xff0c;好的304不锈钢管加工制做…

jrockit_Java堆空间– JRockit和IBM VM

jrockit本文将为您提供JRockit Java堆空间与HotSpot VM的概述。 它还将为您提供有关JRockit和HotSpot的Oracle未来计划的一些背景知识。 Oracle JRockit VM Java堆&#xff1a;2个不同的内存空间 -Java堆&#xff08;YoungGen和OldGen&#xff09; -本机内存空间&#xff08;…

检验例题_高考必考|化学工艺流程之物质的分离提纯及检验鉴别,轻松拿分

嗨&#xff0c;小器来喽&#xff01;今天给大家带来的资料依旧是化学的工艺流程的相关知识&#xff0c;因为小器知道在这部分内容中大家是很容易丢分的&#xff0c;都是基础知识不扎实的原因&#xff0c;所以给大家的资料都是从易到难的安排还有专属高考相关例题&#xff0c;简…

三态门三个状态vhdl_温故知新,高阻态和三态门

欢迎FPGA工程师加入官方微信技术群高阻态高阻态这是一个数字电路里常见的术语&#xff0c;指的是电路的一种输出状态&#xff0c;既不是高电平也不是低电平&#xff0c;如果高阻态再输入下一级电路的话&#xff0c;对下级电路无任何影响&#xff0c;和没接一样&#xff0c;如果…

口译员设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

「Unity」UGUI的Text实现首行缩进的办法

我的Unity版本&#xff1a;5.3.5f1 直接说正事 Unity的Text组件&#xff0c;想实现代码拿到一段话&#xff0c;在前面加个缩进&#xff0c;让之后的字符依次后移。 有人觉得很简单&#xff0c;然后就这样写了&#xff1a; 但是尝试过的人就会发现&#xff0c;如果用代码在最前…

在Eclipse中配置Tomcat7.0

为了在Eclipse中进行struts2的测试,才发现自己机器上的Eclipse没有集成Tomcat,在网上找了半天&#xff0c;不是这个插件没有下载地址&#xff0c;就是那个有好多注意事项或者版本问题。结果&#xff0c;自己到tomcatforEclipse的插件的网上直接下载了一个&#xff0c;按照提供的…

Datepicker

本文翻译自官网&#xff1a; https://angular-ui.github.io/bootstrap 目录&#xff1a; 1. DatePicker 2. DatePicker popup 一、DatePicker https://angular-ui.github.io/bootstrap/#/datepicker 1. 三种模式 Datepicker是灵活&#xff0c;完全可定制的。它有3种模式&#…

cobertura 使用_使用Cobertura,JUnit,HSQLDB,JPA涵盖您的测试

cobertura 使用你好&#xff01;你好吗&#xff1f; 今天让我们谈谈一个非常有用的工具&#xff0c;名为“ Cobertura”。 该框架与我们在另一篇文章中看到的Emma框架具有相同的功能。 Cobertura和Emma之间的主要区别在于Cobertura显示带有图形的简历页面。 如果要查看有关此…

摇杆控制方向原理_图文全面讲解多种方向控制阀的原理和区别....

液压阀是用来控制液压系统中油液的流动方向或调节其流量和压力的。方向控制阀作为液压阀的一种&#xff0c;利用流道的更换控制着油液的流动方向单向型方向控制阀是只允许气流沿一个方向流动的方向控制阀&#xff0c;如单向阀、梭阀、双压阀等换向型方向控制阀是可以改变气流流…