抽象工厂和工厂方法示例_工厂方法设计模式示例

抽象工厂和工厂方法示例

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

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

目录

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

1.简介

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

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

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

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

适合这种情况的工厂方法模式定义了一个用于创建对象的接口,但是让子类决定要实例化哪个类。 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/337015.shtml

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

相关文章

这10个C语言技巧让初学者少走180天弯路!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删技巧 1:不要使用“GOTO”语句二十几年前,当计算机编程尚处于起步阶段时,程序流程是由“GOTO”语句来控制。该…

hystrix熔断 简介_Hystrix简介

hystrix熔断 简介在过去的几天里,我一直在探索Netflix Hystrix库,并欣赏了这个出色的库所提供的功能。 引用Hystrix网站上的内容: Hystrix是一个延迟和容错库,旨在隔离对远程系统,服务和第三方库的访问点&#xff0c…

89 个嵌入式相关概念,你懂几个?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删01操作系统(Operating System,OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内…

C语言不是最好的,却是我最爱的~

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删以下为译文:虽然 C 语言并不是我所学的第一门语言,也不是我的最后一门语言,但是我仍然非常喜欢 C&#xff0c…

lucene 源码分析_Lucene分析过程指南

lucene 源码分析本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中…

ggplot2箱式图两两比较_R语言进阶笔记2 | 长数据与ggplot2

1. 长数据是什么鬼?之前介绍了如何将多个性状的箱线图放在一个图上,比如learnasreml包中的fm数据,它有h1~h5五年的株高数据,想对它进行作图。「数据预览:」> library(learnasreml)> data(fm)> head(fm) Tree…

面向对象,C语言实现简单工厂模式,思路+代码

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删1、简介简单工厂方法定义一个用于创建对象的类,该类接受一个参数,通过参数决定创建不同的对象。GOF并没有把简单工厂方法…

javaone_JavaOne和OOW 2015总结

javaone大家好! 终于,我回来了一个很棒的JavaOne和OOW2015。在这篇文章中,我想分享我的经验,一些照片和我参加的演讲的摘要。 会议前 我于2015年6月24日星期六乘Copa航空公司CLO-PTY-SFO飞往旧金山。 从哥伦比亚出发(…

如何导出久其报表所有数据_如何选择好的HR软件

相信HR朋友想要换HR系统的时候,一般都会在百度、360和搜狗上找,或者通过朋友介绍,而自己百度找的时候,就会出现很多HR软件的广告,一个一个的去问,也不一定能问出所以然,所以就约着面谈&#xff…

网站快速变灰色,几行代码就搞定了!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删自从伟大的江爷爷走了后,全站和各个App的内容都变成了灰色,包括按钮、图片等等。这时候我们可能会好奇这是怎么做到的呢&…

java 递归 堆栈_Java中的堆栈安全递归

java 递归 堆栈在本文中,摘自《 Java中的函数编程 》一书,我解释了如何使用递归,同时避免了StackOverflow异常的风险。 Corecursion正在使用第一步的输出作为下一步的输入来构成计算步骤。 递归是相同的操作,但是从最后一步开始。…

cshtml中引用css_css基础必备-使用样式,前端小白一看就会

在HTML文档中包含CSSCSS可以作为单独的文档引用,也可以嵌入到HTML文档中。在HTML文档中包含CSS有三种方法:内联样式 - 使用元素起始标记的style属性指定样式嵌入样式 - 在文档的head部分使用style标记指定样式外部样式 - 在文档的head部分使用link标记引…

嵌入式软件分层框架设计,举个例子

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删前言为了能够使得产品得到更好的开发速度与以后更好的迭代和移植,框架分层是很有必要的。但如对于中小型项目严格遵循这些原则&#…

腾讯大举退出美团!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删11月16日,腾讯发布第三季度财报,同时表示将“分红式减持”美团。腾讯分派90.9%美团持股 腾讯系中概股美股盘前多数下跌腾…

matchers依赖_Hamcrest Matchers教程

matchers依赖本文是我们名为“ 用Mockito测试 ”的学院课程的一部分。 在本课程中,您将深入了解Mockito的魔力。 您将了解有关“模拟”,“间谍”和“部分模拟”的信息,以及它们相应的存根行为。 您还将看到使用测试双打和对象匹配器进行验证…

谷歌开源替代 C++ 的编程语言:Carbon

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删谷歌工程师 Chandler Carruth 近日在多伦多举办的 CppNorth 大会上宣布①,正式开源谷歌内部打造的编程语言:Carbon&#…

C语言灵魂拷问:++i为何比i++执行效率高!有何区别?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删背景相信很多人遇到过这样的问题:printf("%d,%d",i,i);也纠结过这个问题,到底答案是什么。确没有一个参考的资…

指标实现层级_企业如何构建核心指标系统,实现业务运营效率提升90%?

本文为帆软数据生产力大赛获奖案例,未经授权禁止转载。01企业简介西安怡康医药连锁有限责任公司成立于2001年,总部设在西安市大庆路副24号,是一家由零售连锁药店发展起来的大型医药连锁企业,除药品零售外,同时兼营药品批发与器械批…

学生时代,你有遇到过像我这样理解C语言的吗?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删今天我讲一下我个人对C语言的认识以及自己的理解,若有错误,还望指出,不甚感激。首先是C语言整体的脉络&#…

scrapyd部署_第八章 第一节 scrapyd和scrapy-client

如果觉得文章对您产生帮助的话, 欢迎关注Python开发之路(微信公众号: python-developer), 及时获取更多教程假设有我们做了一个项目是抓取很多网站(每个网站对应一个爬虫), 需要分别部署到不同的服务器上(单台扛不住), scrapy官方也提供了一种部署工具scrapyd。这个工具是用来将…