首页 > 编程知识 正文

工厂模式是为了解决什么问题,工厂类设计模式

时间:2023-05-04 14:59:26 阅读:245108 作者:3097

工厂设计模式解决什么问题

工厂设计模式是面向对象环境中最常用的模式之一。 再次来自“创意设计”模式类别,即有关对象创建的所有信息。

在某些情况下,对象的创建很复杂,可能需要某种程度的抽象,以便客户端代码不了解这些复杂性和内部实现细节。 在某些情况下,对象的创建在代码的各个部分中是分散的和重复的。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中的接口是没有实现的方法定义的集合。 实现接口的类必须提供实现,并且必须实现接口中描述的所有方法。 该接口是一个契约,它告诉类要做什么,让类决定如何实现它们。 interface Bounceable { void setBounce();}

下面的类图将全面概述Factory Pattern的实现:

工厂模式类图

让我们看一下实现工厂模式的示例代码:

GarmentType.java public interface GarmentType { String print();} Trouser.java public class Trouser implements GarmentType { @Override public String print() { System.out.println("Trouser Created"); return "Trouser"; }} Shirt.java public class Shirt implements GarmentType { @Override public String print() { System.out.println("Shirt Created"); return "Shirt"; }} GarmentFactory.java public class GarmentFactory { public static GarmentType createGarments(String selection) { if (selection.equalsIgnoreCase("Trouser")) { return new Trouser(); } else if (selection.equalsIgnoreCase("Shirt")) { return new Shirt(); } throw new IllegalArgumentException("Selection doesnot exist"); }} 客户端程序 public class Client { public static void main(String[] args) { System.out.println("Enter your selection:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String selection = null; try { selection = br.readLine(); } catch (IOException e) { e.printStackTrace(); } GarmentType objGarmentType = GarmentFactory.createGarments(selection); System.out.println(objGarmentType.print()); }}

工厂模式的优势:

a)此客户端不需要了解需要创建的对象的子类。 它需要引用接口和工厂对象。
b)对象创建过程从客户端带到工厂,从而使客户端代码与对象创建代码脱钩。 反过来,这将有助于重用,因为此代码可被其他客户端使用。
c)工厂模式还有助于提高应用程序的可伸缩性,因为客户端代码仅引用接口,我们可以添加更多实现该接口的产品,而无需在客户端代码中进行很多更改。 d)如果应用程序使用Factory模式(因为对象创建是集中的),则代码可维护性将是有益的。

参考: 通过 Idiotechie博客上的JCG合作伙伴 Mainak Goswami 使用Factory Pattern解决设计问题 。


翻译自: https://www.javacodegeeks.com/2012/07/solve-design-problems-using-factory.html

工厂设计模式解决什么问题

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。