工厂方法设计模式示例

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

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

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{

	@Override
	public 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{

	@Override
	public String parse() {
		System.out.println("Parsing feedback XML...");
		return "Feedback XML Message";
	}

}

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

其他XML解析器是:

package com.javacodegeeks.patterns.factorymethodpattern;

public class OrderXMLParser implements XMLParser{

	@Override
	public String parse() {
		System.out.println("Parsing order XML...");
		return "Order XML Message";
	}

}

package com.javacodegeeks.patterns.factorymethodpattern;

public class ResponseXMLParser implements XMLParser{

	@Override
	public 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{

	@Override
	public XMLParser getParser() {
		return new ErrorXMLParser();
	}

}
package com.javacodegeeks.patterns.factorymethodpattern;

public class FeedbackXMLDisplayService extends DisplayService{

	@Override
	public XMLParser getParser() {
		return new FeedbackXML();
	}

}
package com.javacodegeeks.patterns.factorymethodpattern;

public class OrderXMLDisplayService extends DisplayService{

	@Override
	public XMLParser getParser() {
		return new OrderXMLParser();
	}

}
package com.javacodegeeks.patterns.factorymethodpattern;

public class ResponseXMLDisplayService extends DisplayService{

	@Override
	public 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值