工厂设计模式解决什么问题
工厂设计模式是面向对象环境中最常用的模式之一。 再次来自“创意设计”模式类别,即有关对象创建的所有信息。在某些情况下,对象的创建很复杂,可能需要某种程度的抽象,以便客户端代码不了解这些复杂性和内部实现细节。 在某些情况下,对象的创建在代码的各个部分中是分散的和重复的。Factory模式通过定义一个专门创建对象的接口解决了这些问题,但该接口使实现类具有灵活性来决定要实例化哪个类。
定义: Factory方法模式是定义用于创建对象的接口,但将对象创建委托给子类。 目的:
查看问题陈述,目标应该是:
工厂模式使用哪种面向对象设计原理?
封装:因为它封装了来自客户端的创建代码。 显然,您可以认为封装的好处也适用于这种模式,例如松耦合和内聚。
实际示例:
考虑一个服装工厂,该工厂生产各种类型的服装,例如衬衫,裤子。 消费者可以通过工厂索要所需的服装类型。 但是,从消费者的角度来看,他们完全不知道是谁在创建此对象。 他们只是知道工厂正在为他们提供所需的服装。
问题陈述:
一种标准做法是通过调用“ new”关键字来创建对象。 设想一个场景,在客户端类中有多种情况,我们调用了多个新关键字来创建新对象。
if (selection.equalsIgnoreCase("Trouser")) { return new Trouser(); } else if (selection.equalsIgnoreCase("Shirt")) { return new Shirt(); }如果现在必须添加夹克或毛衣,则必须继续修改客户端代码,并进一步添加new关键字。 这将导致对客户端代码的依赖性,从而使其难以维护。
另一个问题是,客户端应用程序必须知道多少类型的具体类可以预先使用。 以后,如果我们必须添加另一个具体的类,例如毛衣或夹克,则必须更改并重新编译客户代码。
解:
为了解决上述问题,可以显式使用工厂模式。
下面的类图将全面概述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
工厂设计模式解决什么问题