工场形式

工场形式(Factory Pattern)是 Java 中最经常利用的设想形式之一。这类范例的设想形式属于建立型形式,它供给了一种建立东西的最好体例。

在工场形式中,咱们在建立东西时不会对客户端裸露建立逻辑,并且是经由进程利用一个配合的接口来指向新建立的东西。

先容

企图:界说一个建立东西的接口,让其子类本身决议实例化哪个工场类,工场形式使其建立进程提早到子类停止。

首要处理:首要处理接口挑选的题目。

甚么时候利用:咱们明白地打算差别前提下建立差别实例时。

若何处理:让其子类完成工场接口,前往的也是一个笼统的产物。

关头代码:建立进程在其子类履行。

利用实例: 1、您须要一辆汽车,能够间接从工场外面提货,而不必去管这辆汽车是怎样做出来的,和这个汽车外面的详细完成。 2、Hibernate 换数据库只需换方言和驱动就能够。

长处: 1、一个挪用者想建立一个东西,只需晓得其称号就能够了。 2、扩大性高,若是想增添一个产物,只需扩大一个工场类就能够。 3、屏障产物的详细完成,挪用者只关怀产物的接口。

错误谬误:每次增添一个产物时,都须要增添一个详细类和东西完成工场,使得体系中类的个数成倍增添,在必然水平上增添了体系的庞杂度,同时也增添了体系详细类的依靠。这并不是甚么功德。

利用场景: 1、日记记实器:记实能够记实到本地硬盘、体系事务、长途办事器等,用户能够挑选记实日记到甚么处所。 2、数据库拜候,当用户不晓得最初体系接纳哪一类数据库,和数据库能够有变更时。 3、设想一个毗连办事器的框架,须要三个和谈,"POP3"、"IMAP"、"HTTP",能够把这三个作为产物类,配合完成一个接口。

注重事变:作为一种建立类形式,在任何须要天生庞杂东西的处所,都能够利用工场方式形式。有一点须要注重的处所便是庞杂东西合适利用工场形式,而简略东西,出格是只须要经由进程 new 就能够完成建立的东西,无需利用工场形式。若是利用工场形式,就须要引入一个工场类,会增添体系的庞杂度。

完成

咱们将建立一个 Shape 接口和完成 Shape 接口的实体类。下一步是界说工场类 ShapeFactory

FactoryPatternDemo,咱们的演示类利用 ShapeFactory 来获得 Shape 东西。它将向 ShapeFactory 通报信息(CIRCLE / RECTANGLE / SQUARE),以便获得它所需东西的范例。

工场形式的 UML 图

步骤 1

建立一个接口:

Shape.java

public interface Shape { void draw(); }

步骤 2

建立完成接口的实体类。

Rectangle.java

public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }

Square.java

public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } }

Circle.java

public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }

步骤 3

建立一个工场,天生基于给定信息的实体类的东西。

ShapeFactory.java

public class ShapeFactory { //利用 getShape 方式获得外形范例的东西 public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); } else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } }

步骤 4

利用该工场,经由进程通报范例信息来获得实体类的东西。

FactoryPatternDemo.java

public class FactoryPatternDemo { public static void main(String args) { ShapeFactory shapeFactory = new ShapeFactory(); //获得 Circle 的东西,并挪用它的 draw 方式 Shape shape1 = shapeFactory.getShape("CIRCLE"); //挪用 Circle 的 draw 方式 shape1.draw(); //获得 Rectangle 的东西,并挪用它的 draw 方式 Shape shape2 = shapeFactory.getShape("RECTANGLE"); //挪用 Rectangle 的 draw 方式 shape2.draw(); //获得 Square 的东西,并挪用它的 draw 方式 Shape shape3 = shapeFactory.getShape("SQUARE"); //挪用 Square 的 draw 方式 shape3.draw(); } }

步骤 5

履路法式,输入成果:

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.

其余相干文章