팩토리 패턴


팩토리 패턴은 Java에서 가장 일반적으로 사용되는 디자인 패턴 중 하나입니다. 이러한 유형의 디자인 패턴은 객체를 생성하는 최적의 방법을 제공하는 생성 패턴입니다.

팩토리 패턴에서는 객체 생성 시 생성 로직을 클라이언트에 노출하지 않고, 공통 인터페이스를 사용하여 새로 생성된 객체를 가리킵니다.

소개

의도: 객체 생성을 위한 인터페이스를 정의하고 해당 하위 클래스가 인스턴스화할 팩토리 클래스를 결정하도록 합니다. 팩토리 패턴은 하위 클래스에 대한 생성 프로세스를 지연시킵니다. 수입.

주로 해결: 주로 인터페이스 선택 문제를 해결합니다.

사용 시기: 다른 조건에서 다른 인스턴스를 생성하려는 명시적인 계획이 있는 경우.

해결 방법: 하위 클래스가 팩토리 인터페이스를 구현하고 추상 제품을 반환하도록 합니다.

키 코드: 생성 프로세스는 하위 클래스에서 실행됩니다.

적용 사례: 1. 자동차가 필요한 경우 자동차가 어떻게 만들어졌는지, 내부 구현이 어떤지 걱정하지 않고 공장에서 직접 픽업할 수 있습니다. 2. Hibernate 데이터베이스를 변경하려면 방언과 드라이버만 변경하면 됩니다.

장점: 1. 호출자가 객체를 생성하려는 경우 해당 객체의 이름만 알면 됩니다. 2. 높은 확장성. 제품을 추가하려면 팩토리 클래스만 확장하면 됩니다. 3. 제품의 특정 구현을 보호하고 호출자는 제품 인터페이스에만 관심을 갖습니다.

단점: 제품을 추가할 때마다 특정 클래스와 객체 구현 팩토리를 추가해야 하는데, 이로 인해 시스템의 클래스 수가 두 배로 늘어나고 시스템 복잡성이 특정 수준으로 증가합니다. 복잡성으로 인해 시스템의 특정 클래스에 대한 의존도도 높아집니다. 이것은 좋은 일이 아닙니다.

사용 시나리오: 1. 로그 기록기: 기록은 로컬 하드 디스크, 시스템 이벤트, 원격 서버 등에 기록될 수 있습니다. 사용자는 로그 기록 위치를 선택할 수 있습니다. 2. 데이터베이스 액세스, 최종 시스템에서 어떤 유형의 데이터베이스가 사용될지 사용자가 알 수 없고 데이터베이스가 언제 변경될 수 있는지 알 수 없는 경우. 3. 서버에 연결하기 위한 프레임워크를 설계하려면 "POP3", "IMAP", "HTTP" 세 가지 프로토콜이 필요합니다. 이 세 가지는 인터페이스를 공동으로 구현하기 위한 제품 범주로 사용할 수 있습니다.

참고: 클래스 생성 패턴으로 팩토리 메소드 패턴은 복잡한 객체를 생성해야 하는 모든 곳에서 사용할 수 있습니다. 한 가지 주의할 점은 복잡한 객체는 팩토리 패턴을 사용하는 데 적합하지만, 간단한 객체, 특히 new를 통해서만 생성할 수 있는 객체는 팩토리 패턴을 사용할 필요가 없다는 점입니다. 팩토리 패턴을 사용하는 경우 팩토리 클래스를 도입해야 하므로 시스템이 더 복잡해집니다.

구현

Shape 인터페이스와 Shape 인터페이스를 구현하는 엔터티 클래스를 만듭니다. 다음 단계는 팩토리 클래스 ShapeFactory를 정의하는 것입니다.

FactoryPatternDemo, 데모 클래스에서는 ShapeFactory를 사용하여 Shape 개체를 가져옵니다. 필요한 개체 유형을 가져오기 위해 정보(CIRCLE / RECTANGLE / SQUARE)를 ShapeFactory에 전달합니다.

工厂模式的 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단계

출력을 확인합니다.

아아아아