CS/디자인 패턴

팩토리 패턴 정리

쪼멘탈 2022. 10. 31. 15:54
반응형
팩토리 패턴 정리

 

팩토리 패턴이란?

팩토리 패턴은 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에게 객체 생성에 관한 구채적인 내용을 결정하는 패턴이다. 즉 객체를 생성하는 인터페이스를 정의 함으로써, 어떤 인스턴스를 생성할지는 하위 클래스에서 결정하는 패턴이다.

 

상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문에 더 많은 유연성을 갖게 된다.(상위는 추상 클래스로 시작 하위는 상위 클래스를 확장하는 구상 클래스) 객체 생성 로직이 따로 분리되어 있기 때문에 코드를 수정할 때 다른 부분에 영향을 주지 않아 유지 보수가 간편하다.

 

모든 팩토리 패턴에서는 객체 생성을 캡슐화, 팩토리 메서드 패턴에서는 서브클래스에서 어떤 클래스를 만들지를 결정하게 함으로써 객체 생성을 캡슐화한다.

 

 

공통이 될 interface를 생성한다.

public interface Shape {
   void draw();
}

인터페이스를 구현하는 클래스를 생성한다.

public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Circle - draw()");
   }
}
public class Triangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Triangle - draw()");
   }
}

 클래스의 객체를 생성하기 위해 Factory를 생성한다.

public class ShapeFactory {
	
   // 구체적인 클래스 객체를 생성하기 위해 사용
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }		
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
         
      } else if(shapeType.equalsIgnoreCase("Triangle")){
         return new Triangle();
         
      } else{
         return null;
      }
     
   }
}

Factory를 사용하여 type과 같은 정보를 전달하여 구체적인 클래스의 객체를 생성한다.

public class FactoryPatternPractice {

   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();

      // CIRCLE 생성
      Shape shape1 = shapeFactory.getShape("CIRCLE");
      shape1.draw();

      // Triangle 생성
      Shape shape2 = shapeFactory.getShape("Triangle");
      shape2.draw();
   }
}

Factory를 사용하여 type과 같은 정보를 전달하여 구체적인 클래스의 객체를 가진다.

결과

Circle - draw()
Triangle - draw()

 

팩토리 패턴의 장점

  • 복잡한 오브젝트 생성 과정을 클라이언트가 직접 다룰 필요가 없다.
  • 수정이 필요할 경우 팩토리 클래스 하나만 고치면 된다.
  • 구조와 구현을 분리한다.

 

팩토리 메서드 패턴(Factory Methods Pattern)  VS  추상 팩토리 패턴 (Abstract Factory Pattern)

 

추상 팩토리 패턴은 동일한 처리 로직의 하위 클래스의 결합을 통해 선택적으로 객체를 생성할 수 있는 장점이 있지만, 새로운 객체가 추가되면 하위 클래스에도 객체가 추가되어 확장 시 모든 하위 클래스의 수정해야 할 수도 있다.

 

팩토리 메서드 패턴은 1개의 하위 클래스(Factory) 내 매개변수를 통해 생성을 선택적으로 처리하여 다형성 갖는 거 같지만, 새로운 객체가 추가할 때마다 조건이 되는 로직을 추가해야 한다. 확장할수록 하위 클래스의 로직이 커져 유지보수가 어려워질 수 있다.

 

추상 팩토리 메서드 패턴은 클라이언트의 입장에서 클라이언트가 추상화된 인터페이스를 통해 객체를 생성하는 방식이지만 추상 팩토리 패턴은 관련 있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해 준다. 둘 다 구체적인 객체 생성 과정을 추상화한다.

 

추상 팩토리 패턴은 팩토리 메서드 패턴의 확장이라고 볼 수 있지만, 더 좋은 패턴이라고는 단정할 수 없다.

 

반응형