반응형
의도
- 상세화된 서브클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 제공
활용성
- 객체가 생성되거나 구성•표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때
- 여러 제품군 중 하나를 선택해서 시스템을 설정해야하고 한 번 구성한 제품을 다른 것으로 대체할 수 있을 때
- 관련된 제품 객체들이 함께 사용되도록 설계되었고, 이 부분에 대한 제약이 외부에도 지켜지도록 하고 싶을 때
- 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출시키고 싶을 때
결과
- 이점
- 구체적인 클래스를 분리한다.
- 제품군을 쉽게 대체 할 수 있도록 한다.
- 제품 사이의 일관성을 증진시킨다.
- 부담
- 새로운 종류의 제품을 제공하기 어렵다.(새로운 제품이 추가되면 팩토리 구현을 변경해야한다.)
협력 방법
- 일반적으로 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
반응형
'Java > Design Pattern' 카테고리의 다른 글
디자인 패턴(Design Pattern) - [생성 패턴]원형 패턴(프로토타입 패턴, Prototype Pattern) 자바(Java) 구현 (0) | 2022.01.26 |
---|---|
디자인 패턴(Design Pattern) - [생성 패턴]팩토리 메서드 패턴(Factory Method Pattern) 자바(Java) 구현 (0) | 2022.01.25 |
디자인 패턴(Design Pattern) - [생성 패턴]빌더 패턴(Builder Pattern) 자바(Java) 구현 (0) | 2022.01.23 |
디자인 패턴(Design Pattern) - 분류 (0) | 2022.01.22 |
디자인 패턴(Design Pattern) - 개요 (0) | 2022.01.21 |