抽象工厂和工厂方法示例

本文是我们名为“ 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

产品

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

混凝土产品

  • 实现产品接口。

创作者

  • 声明工厂方法,该方法返回产品类型的对象。 创建者还可以定义工厂方法的默认实现,该方法返回默认的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

抽象工厂和工厂方法示例

抽象工厂和工厂方法示例_工厂方法设计模式示例相关推荐

  1. 设计模式示例_责任链设计模式示例

    设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...

  2. 单例模式示例_单例设计模式示例

    单例模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...

  3. 装饰着模式示例_装饰器设计模式示例

    装饰着模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原 ...

  4. 工厂方法模式_工厂方法模式

    工厂方法模式是简单工厂模式的升级版,简单工厂模式不符合设计模式的原则(即:单一职责,开闭原则) 优点: 职责明确,扩展方便 缺点:需要创建多个工厂 实现步骤: 1.将工厂通用方法抽取接口 (例如:IF ...

  5. c 工厂模式与mysql链接_工厂模式连接数据库

    在项目中通常可能会使用不同的数据源,可能是SQL Server也可能是ACCESS或者是Oracle,那么如何保证在使用不同数据源的时候,使项目代码更改的代价最小呢? 对,使用工厂模式.在Net1.1 ...

  6. 工厂模式三部曲之二_工厂模式

    自<工厂模式三部曲之一_简单工厂模式>之后,貌似已经很久没有继续这个三部曲了,所以抽点时间把后两篇给补上吧.首先回顾下简单工厂模式的主要内容:简单工厂模式就是实质就是专门定义了一个工厂类, ...

  7. lucene 查询示例_高级Lucene查询示例

    lucene 查询示例 本文是我们名为" Apache Lucene基础知识 "的学院课程的一部分. 在本课程中,您将了解Lucene. 您将了解为什么这样的库很重要,然后了解Lu ...

  8. 灰度重采样的方法分为_重采样方法比较~

    展开全部 最邻近法(Nearest Neighbor):最邻近法直接将与某像元位置最邻近的像元值作为该像32313133353236313431303231363533e58685e5aeb93133 ...

  9. xml格式是什么示例_什么是对抗示例?

    xml格式是什么示例 In recent times, Machine Learning (a subset of Artificial Intelligence) has been at the f ...

最新文章

  1. Linux主机下无报错安装Apache服务器
  2. [示例]创建Student类,输入学生信息并存入字典,将3个存有学生信息的字典存入数组,并计算...
  3. day12装饰器进阶
  4. docker安装gitlab_docker 安装部署gitlab
  5. 鱼塘钓鱼(信息学奥赛一本通-T1373)
  6. java 写oracle clob_Java将数据写入Oracle的Clob字段中
  7. 解决IE6下CSS兼容性的两把神器
  8. C++中的声明和定义
  9. 语言类型介绍及其Python的语言类型
  10. 001LeetCode--TwoSum
  11. Docker安装迅雷下载工具实现远程下载
  12. 怎么用计算机拟合函数wps,如何在excel 里利用曲线拟合的方式求公式|
  13. .NET性能相关书籍
  14. 使用usb tplink无线网卡搭建无线热点AP
  15. web开发字体图标制作
  16. VScode 中查看本地ip地址
  17. 芋头哥:从码农到农民,靠微博3个月卖出20万斤
  18. Python简单实现人脸识别检测, 对某平台美女主播照片进行评分排名
  19. ProSpec 胶质源性神经营养因子人重组说明书
  20. 原生JS实现动态返回顶部

热门文章

  1. P4585-[FJOI2015]火星商店问题【线段树,可持久化Trie】
  2. P4172-[WC2006]水管局长【LCT,最小生成树】
  3. P4284-[SHOI2014]概率充电器【树形dp,换根法,数学期望】
  4. P3384-[模板]树链剖分
  5. 【jzoj】2018.1.31 NOIP普及组——D组模拟赛
  6. codeforces1553 F. Pairwise Modulo(数学)
  7. Oracle入门(三)之连接与登录
  8. 高级JAVA码农必须搞清楚它们的区别:instanceof、isInstance、isAssignableFrom
  9. 计算机入门的一些常用小技巧总结
  10. python的三元运算