의도 : 구체화된 서브클래스 정의 없이 서로 관련 있는 객체 군 생성을 위한 인터페이스를 제공한다.
활용
장점
단점
예시
한 소비자가 삼성과 애플 두 핸드폰 판매 브랜드의 핸드폰을 주문한다고 가정하자. 핸드폰 구성요소로는 디스플레이와 내부 장치가 존재하며 핸드폰에는 각 브랜드의 구성품이 사용되어야 한다.
UML
핸드폰을 생산하는 공장 PhoneFactory 클래스, 내부 장치 InnenrDevice 클래스, 디스플레이 Display 클래스가 각각 가상 클래스로 존재하고 삼성과 애플은 위 세 클래스를 상속받아 사용한다면 위 UML과 같이 표현할 수 있다.
예시 코드의 흐름은 아래와 같다.
public abstract class Display {
public Display() {
}
public abstract void testDisplay();
}
class SamsungDisplay extends Display {
public SamsungDisplay() {}
@Override
public void testDisplay() {
System.out.println("삼성 디스플레이 테스트");
}
}
class AppleDisplay extends Display {
public AppleDisplay() {}
@Override
public void testDisplay() {
System.out.println("애플 디스플레이 테스트");
}
}
public abstract class InnerDevice {
public InnerDevice() {}
public abstract void testKeyboardInput();
public abstract void testMicrophoneInput();
}
class SamsungInnerDevice extends InnerDevice {
public SamsungInnerDevice() {}
@Override
public void testKeyboardInput() {
System.out.println("삼성 키보드 입력 테스트");
}
@Override
public void testMicrophoneInput() {
System.out.println("삼성 마이크 입력 테스트");
}
}
class AppleInnerDevice extends InnerDevice {
public AppleInnerDevice() {}
@Override
public void testKeyboardInput() {
System.out.println("애플 키보드 입력 테스트");
}
@Override
public void testMicrophoneInput() {
System.out.println("애플 마이크 입력 테스트");
}
}
public abstract class PhoneFactory {
public PhoneFactory() {};
public abstract Display createDisplay();
public abstract InnerDevice createInnerDevice();
}
class SamsungPhoneFactory extends PhoneFactory {
public SamsungPhoneFactory() {}
@Override
public Display createDisplay() {
return new SamsungDisplay();
}
@Override
public InnerDevice createInnerDevice() {
return new SamsungInnerDevice();
}
}
class ApplePhoneFactory extends PhoneFactory {
public ApplePhoneFactory() {}
@Override
public Display createDisplay() {
return new AppleDisplay();
}
@Override
public InnerDevice createInnerDevice() {
return new AppleInnerDevice();
}
}
public class AbstarctFactoryProject {
public static void main(String[] args) {
SamsungPhoneFactory samsungPhoneFactory = new SamsungPhoneFactory();
System.out.println("- 삼성 핸드폰 생산 - ");
createPhone(samsungPhoneFactory);
ApplePhoneFactory applePhoneFactory = new ApplePhoneFactory();
System.out.println("\n- 애플 핸드폰 생산 - ");
createPhone(applePhoneFactory);
}
public static void createPhone(PhoneFactory factory) {
Display display = factory.createDisplay();
display.testDisplay();
InnerDevice innerDevice = factory.createInnerDevice();
innerDevice.testKeyboardInput();
innerDevice.testMicrophoneInput();
}
}
실행결과
마무리
생성 패턴 중 하나인 추상 팩토리 패턴에 대해 학습하였다. 추상 팩토리 클래스는 팩토리 매서드 패턴이나 원형패턴, 그리고 단일체 팩턴 등을 사용한다고 한다. 이후 이러한 패턴을 학습할 때 복습할 필요가 있을 것 같다.
참고
에릭 감마, 리처드 헬름, 랄프 존슨, 존 블리시디스, 『GoF의 디자인 패턴』, 프로텍 미디어, 2015
[디자인패턴] 의존성 주입이란? (0) | 2023.03.12 |
---|---|
[디자인패턴/Java] 원형 패턴( Prototype Pattern) (0) | 2022.04.11 |
[디자인패턴] 팩토리 매서드 (Factory Method Pattern) (0) | 2022.04.02 |
[디자인패턴] 빌더 패턴 (Builder Pattern) (0) | 2022.03.25 |