추상 팩토리 패턴
서로 관련 있는 여러 객체를 만들어주는 인터페이스를 제공한다.
구체적으로 어떤 클래스의 인스턴스를 사용하는 지 감출 수 있다.
다이어그램

출처: https://gmlwjd9405.github.io/images/design-pattern-abstract-factory/abstract-factory-pattern.png
팩토리 메서드 패턴과 추상 팩토리 패턴
팩토리 메서드 패턴 | 추상 팩토리 패턴 | |
공통점 | 구체적인 객체 생성 과정을 추상화한 인터페이스를 제공한다. | |
특징 | - 팩토리를 구현하는 방법에 초점을 둔다. - 구체적인 객체 생성 과정을 하위 또는 구체적인 클래스로 옮기는 것이 목적이다. |
- 팩토리를 사용하는 방법에 초점을 둔다. - 관련 있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것이 목적이다. |
예제
1. AbstractFactory
public interface SmartPhonePartsFactory {
Camera createCamera();
Display createDisplay();
}
- AbstractFactory를 interface로 생성함으로써, 구현을 통해 객체(ConcreteProduct)를 생성한다.
2. AbstractProduct
public interface Camera {
/* empty */
}
public interface Display {
/* empty */
}
- Product는 이 AbstractProduct를 상속받으며, ConcreteFactory에서 해당 Product를 생성하게 된다.
3. ConcreteFactory
public class SamsungPartsFactory implements SmartPhonePartsFactory {
@Override
public Camera createCamera () {
return new SamsungCamera();
}
@Override
public Display createDisplay () {
return new SamsungDisplay();
}
}
- AbstractFactory를 구현한 ConcreteFactory이다.
- AbstractProduct인 Camera와 Display를 상속받은 SamaungCamera와 SamsungDisplay를 생성한다.
4. ConcreteProduct
public class SamsungCamera implements Camera {
/* empty */
}
public class SamsungDisplay implements Display {
/* empty */
}
- AbstractProduct를 상속받은 ConcreteProduct이다.
5. Client
public class SamsungSmartPhoneFactory implements SmartPhoneFactory {
private SmartPhonePartsFactory smartPhonePartsFactory;
public SamsungSmartPhoneFactory (SmartPhonePartsFactory smartPhonePartsFactory) {
this.smartPhonePartsFactory = smartPhonePartsFactory;
}
@Override
public SmartPhone createSmartPhone (String color) {
SmartPhone smartPhone = new SamsungSmartPhone( color );
smartPhone.setCamera( smartPhonePartsFactory.createCamera() );
smartPhone.setDisplay( smartPhonePartsFactory.createDisplay() );
return smartPhone;
}
}
- SamsungSmartPhoneFactory는 AbstractFactory를 필드로 가지며, 생성될 때 의존 관계를 주입받게 된다.
- createSmartPhone()에서 삼성 스마트폰이 생성되는 과정 중에 Camera와 Display가 AbstractFactory에 의해 생성된다. (실제로는 ConcreteFactory가 생성하게 될 것.)
# 삼성 스마트폰 생성자 코드는 [팩토리 메서드 패턴] 게시글에서 확인할 수 있다. 이 게시글의 코드들은 해당 게시글에 기재된 코드들을 확장한 것이다.
6. Test
public class Test {
public static void main (String[] args) {
SmartPhoneFactory smartPhoneFactory = new SamsungSmartPhoneFactory( new SamsungPartsFactory() );
SmartPhone smartPhone = smartPhoneFactory.orderSmartPhone( "다라이레드" );
System.out.println( "smartPhone = " + smartPhone );
}
}

참고 사이트: https://sun-22.tistory.com/10
참고 강의: 백기선 - 코딩으로 학습하는 GoF의 디자인 패턴 (인프런)
'Design Pattern' 카테고리의 다른 글
Factory Method Pattern (0) | 2022.01.15 |
---|---|
Singleton Pattern (0) | 2022.01.13 |
댓글