使用工厂模式解决设计问题

工厂模式是一种设计模式,用于封装对象的创建,使客户端代码与具体实现细节解耦。通过定义创建对象的接口,工厂模式允许系统在不指定具体类的情况下使用新产品。在代码示例中,一个服装工厂生产不同类型的服装,如衬衫和裤子,消费者只与工厂交互,而不关心对象是如何实例化的。工厂模式的优点包括客户端代码的可维护性和可扩展性。
摘要由CSDN通过智能技术生成
工厂设计模式是面向对象环境中最常用的模式之一。 再次来自“创意设计”模式类别,即有关对象创建的所有信息。

在某些情况下,对象的创建很复杂,可能需要某种程度的抽象,以便客户端代码无法意识到这些复杂性和内部实现细节。 在某些情况下,对象的创建在代码的各个部分中是分散的和重复的。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)Factory模式还有助于提高应用程序的可伸缩性,因为客户端代码仅引用接口,我们可以添加更多实现该接口的产品而无需在客户端代码中进行很多更改。 d)如果应用程序使用Factory模式(因为对象创建是集中的),则代码可维护性是有益的。

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值