在某些情况下,对象的创建很复杂,可能需要某种程度的抽象,以便客户端代码无法意识到这些复杂性和内部实现细节。 在某些情况下,对象的创建在代码的各个部分中是分散的和重复的。Factory模式通过定义一个接口专门解决了该问题,这些接口专门创建对象,但为实现类提供了灵活性,可以决定实例化哪个类。
定义: |
Factory方法模式是定义用于创建对象的接口,但将对象创建委托给子类。 |
目的:
查看问题陈述,目标应该是:
- 客户端应该不知道对象实例化
- 客户端应通过公共接口访问对象。
你知道吗? |
工厂方法设计模式通常与装饰器设计模式一起用于各种框架(例如Struts,Spring,Apache)中。 有许多基于此Factory模式的J2EE模式,例如DAO模式。 |
工厂模式使用哪种面向对象设计原理?
封装:因为它封装了来自客户端的创建代码。 显然,您可以认为封装的好处也适用于这种模式,例如松耦合和内聚。
实际示例:
考虑一个服装工厂,该工厂生产各种类型的服装,例如衬衫,裤子。 消费者可以通过工厂索要所需的服装类型。 但是,从消费者的角度来看,他们完全不知道是谁在创建此对象。 他们只是知道工厂正在为他们提供所需的服装。
问题陈述:
一种标准做法是通过调用“ new”关键字来创建对象。 设想一个场景,在客户端类中有多种情况,我们调用了多个新关键字来创建新对象。
if (selection.equalsIgnoreCase("Trouser")) {return new Trouser();} else if (selection.equalsIgnoreCase("Shirt")) {return new Shirt();}
如果现在必须添加外套或毛衣,则必须继续修改客户端代码,并进一步添加new关键字。 这将导致对客户端代码的依赖,从而使其难以维护。
另一个问题是客户端应用程序必须知道有多少种具体的类可以使用。 以后,如果我们必须添加另一个具体类,例如毛衣或夹克,则必须更改并重新编译客户代码。
解:
为了解决上述问题,可以显式使用工厂模式。
- 使用Factory类可以解决访问太多新关键字的第一个问题。
- 第二个问题可以通过使用具体类将实现的接口来解决,并且客户端将始终指向该接口类而不是具体类。 因此,通过这种方式,客户将完全不知道所需的各种类型的具体类。
什么是接口? |
Java中的接口是没有实现的方法定义的集合。 实现接口的类必须提供实现,并且必须实现接口中描述的所有方法。 接口是一个契约,它告诉类要做什么,让类决定如何实现它们。
|
下面的类图将全面概述Factory Pattern的实现:
工厂模式类图 |
让我们看一下实现工厂模式的示例代码:
GarmentType.java |
|
Trouser.java |
|
Shirt.java |
|
GarmentFactory.java |
|
客户端程序 |
|
工厂模式的优势:
a)此客户端不需要了解需要创建的对象的子类。 它需要引用接口和工厂对象。
b)对象创建过程从客户端带到工厂,从而使客户端代码与对象创建代码脱钩。 反过来,这将有助于重用,因为此代码可被其他客户端使用。 c)Factory模式还有助于提高应用程序的可伸缩性,因为客户端代码仅引用接口,我们可以添加更多实现该接口的产品而无需在客户端代码中进行很多更改。 d)如果应用程序使用Factory模式(因为对象创建是集中的),则代码可维护性是有益的。
参考: 通过 Idiotechie博客上的JCG合作伙伴 Mainak Goswami 使用Factory Pattern解决设计问题 。
翻译自: https://www.javacodegeeks.com/2012/07/solve-design-problems-using-factory.html