# 추상 팩토리 (Abstract Factory) 패턴

# 추상 팩토리란 무엇인가요?

서로 연관되거나 의존적인 객체들의 조합을 생성하기위한 인터페이스를 제공하는 패턴입니다.

TIP

관련성 있는 여러 종류의 객체를 일관된 방식으로 생성하는 경우에 유용합니다.

# 예시 코드

  • ex) 엘레베이터에 필요한 문의 인터페이스와 구체적인 클래스
public abstract class Door {
    ...
}

public class LGDoor extends Door {
    ...
}

public class SamsungDoor extends Door {
    ...
}
  • ex) 엘레베이터에 필요한 모터의 인터페이스와 구체적인 클래스
public abstract class Motor {
    ...
}

public class LGMotor extends Motor {
    ...
}

public class SamsungMotor extends Motor {
    ...
}
  • ex) 엘레베이터의 인터페이스와 구체적인 클래스
public abstract class ElevatorFactory {
    public abstract Motor createMotor();
    public abstract Door createDoor();
}

public class LGElevatorFactory extends ElevatorFactory {
    public Motor createMotor() {
        return new LGMotor();
    }
    
    public Door createDoor() {
        return new LGDoor();
    }
}
public class SamsungElevatorFactory extends ElevatorFactory {
    ...
}
  • ex) 엘레베이터 생성
public class ElevatorFactoryFactory {
    public static ElevatorFacotory getFactory(VendorID vendorID) {
        ElevatorFactory factory = null;
        switch(vendorID) {
            case LG:
                factory = LGElevatorFactory();
                break;
            case SAMSUNG:
                factory = SamsungElevatorFactory();
                break;
        }
        
        return factory;
    }
}
  • ex) 사용자가 원하는 엘레베이터 입력및 생성호출
public enum VendorID { LG, SAMSUNG }

public class Client{
    public static void main(String[] args) {
        String vendorName = args[0];
        VendorID vendorID;
        if(vendorID.equalsIgnorCase("LG")) {
            vendorID = VendorID.LG;
        } else {
            vendorID = VendorID.SAMSUNG;
        }
        
        ElevatorFactory factory = ElevatorFactoryFactory.getFactory(vendorID);
        
        Door door = factory.createDoor();
        Motor motor = factory.createMotor();
    }
}

# 팩토리 메소드와 추상 팩토리의 차이는 무엇인가요?

팩토리 메소드는 조건에 따른 객체 생성을 팩토리 클래스로 위임하여, 팩토리 클래스에서 객체를 생성하는 패턴이지만
추상 팩토리는 서로 관련이 있는 객체들을 묶어서 팩토리 클래스로 만들고, 그 팩토리를 조건에 따라 생성하도록 다시 팩토리를 만들어서 객체를 생성하는 패턴입니다.

# 추상 팩토리를 사용하는 경우

  • 객체가 생성되거나 구성, 표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때
  • 여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체할 경우가 있을 때
  • 관련된 제품 객체들이 함께 사용되도록 설계되었고, 이 부분에 대한 제약이 외부에도 지켜지도록 하고 싶을 때

# 추상 팩토리의 장점은 무엇인가요?

  • 구체적인 클래스를 분리하기 때문에 사용자는 추상 인터페이스에 대해서만 알고 있어도 됩니다.
  • 구체 팩토리를 변경함으로써 다른 비슷한 객체로 쉽게 대체할 수 있습니다.

# 추상 팩토리의 단점은 무엇인가요?

  • 새로운 기능이 추가된다면 추상 팩토리를 상속받는 모든 팩토리에 새로운 기능 구현방법이 추가되어야 해서, 기존 추상 팩토리를 확장하는 것이 쉽지 않습니다.

# 참고자료

출처: 정인상, 채홍석.JAVA 객체지향 디자인 패턴.서울:한빛미디어,2019.
출처: https://devowen.com/326 [DevOwen]