반응형

의도

  • 상세화된 서브클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 제공

 

활용성

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

 

결과

  • 이점
    • 구체적인 클래스를 분리한다.
    • 제품군을 쉽게 대체 할 수 있도록 한다.
    • 제품 사이의 일관성을 증진시킨다.
  • 부담
    • 새로운 종류의 제품을 제공하기 어렵다.(새로운 제품이 추가되면 팩토리 구현을 변경해야한다.)

 

협력 방법

  • 일반적으로 ConcreteFactory 클래스의 인스턴스 한 개가 런타임에 만들어진다. 이 구체 팩토리(concrete factory)는 어떤 특정 구현을 갖는 제품 객체를 생성한다. 서로 다른 제품 객체를 생성하려면 사용자는 서로 다른 구체 팩토리를 사용해야 한다.
  • AbstractFactory는 필요한 제품 객체를 생성하는 책임을 ConcreteFactory 서브 클래스에 위임한다.

 

구조

실제 구현 구조

소스코드

//AbstractFactory
public interface HardwareFactory {
    Mouse createMouse();
    Keyboard createKeyboard();
}
//ConcreteFactory1
public class RazerFactory implements HardwareFactory {

    @Override
    public Mouse createMouse(){
        return new RazerMouse();
    }

    @Override
    public Keyboard createKeyboard() {
        return new RazerKeyboard();
    }

}
//ConcreteFactory2
public class LogitechFactory implements HardwareFactory {

    @Override
    public Mouse createMouse() {
        return new LogitechMouse();
    }

    @Override
    public Keyboard createKeyboard() {
        return new LogitechKeyboard();
    }

}
//AbstractProductA
public interface Mouse {
}
//ProductA1
public class RazerMouse implements Mouse {
    public RazerMouse(){
        System.out.println("RazerMouse create");
    }
}
//ProductA2
public class LogitechMouse implements Mouse {
    public LogitechMouse(){
        System.out.println("LogitechMouse create");
    }
}
//AbstractProductB
public interface Keyboard {
}
//ProductB1
public class RazerKeyboard implements Keyboard {
    public RazerKeyboard(){
        System.out.println("RazerKeyboard create");
    }
}
//ProductB2
public class LogitechKeyboard implements Keyboard {
    public LogitechKeyboard(){
        System.out.println("LogitechKeyboard create");
    }
}
public class Main {
    public static void main(String[] args) {
        //초기 로지텍 팩토리로 한 경우
        HardwareFactory hardwareFactory = new LogitechFactory();
        hardwareFactory.createMouse();
        hardwareFactory.createKeyboard();
        System.out.println("----------------------");
        //레이저 팩토리로 교체 후 생성
        hardwareFactory = new RazerFactory();
        hardwareFactory.createMouse();
        hardwareFactory.createKeyboard();
    }
}

 

  • 실제로 동작하는 모습을 보면 HardwareFactory는 인터페이스 역할만 담당하고 있고 ConcreteFactory(RazerFactory, LogitechFactory)에서 객체생성을 하고 있다.
  • 초기에는 LogitechFactory에서 제품을 생산하지만 추후에 RazerFactory로 변경하여 제품군을 대체하였다. 이 과정에서 코드의 변경은 HardwareFactory의 구현체 부분만 발생하였다.
  • 만약, 마우스 패드 제품이 추가된다면 팩토리 구현에 관련된 부분은 모두 수정되어야 한다.

 


[참고자료]

리처드 헬름, 랄프 존슨, 존 블리시디스, 『GoF의 디자인 패턴 : 재사용성을 지닌 객체지향 소프트웨어의 핵심요소』, 김정아 번역, 프로텍미디어(2015)

https://commons.wikimedia.org/wiki/File:Abstract_factory_UML.svg

반응형

+ Recent posts