728x90
추상 팩토리 패턴
: 비슷한 속성의 제품(객체)들을 인터페이스로 규격화된 공정(팩토리)에서 일관된 방식으로 생성하고, 생성된 제품끼리는 쉽게 교체될 수 있도로 고안한 패턴
→ 클래스로부터 객체 생성 책임을 분리하는 패턴
기본 구조
추상 팩토리 패턴 구조
1. 추상 팩토리 인터페이스 → 추상 제품을 생성하는 인터페이스 제공
2. 구현 팩토리 클래스 → 구현된 제품을 생산하는 방법 구현
3. 추상 제품 인터페이스 → 제품에 대한 추상적 인터페이스 제공
4. 구현 제품 클래스 → 팩토리가 생성할 구체적인 제품
# 장점
- 객체를 분리함으로써 은닉성을 적용한다.
- 특정 클래스에 의존하지 않는다.
- 다른 그룹으로 변경돼도 하위 클래스를 통해 선택적 객체를 다르게 생성할 수 있다.
- 일부는 인터페이스와 같은 역할을 하여, 코드를 일관적으로 유지하고 실제 구현을 다르게 실행시킬 수 있다.
# 단점
- 새로운 종류의 군을 추가하는 것이 쉽지 않다.(모든 서브 클래스들이 동시에 변경돼야 하기 때문)
- 계층의 크기가 커질수록 복잡한 문제가 발생한다.
추상 팩토리 패턴과 팩토리 메소드 패턴의 차이점
→ 팩토리 메소드를 확장한 추상 팩토리
→ 팩토리 패턴과 팩토리 메소드 패턴의 차이는 추상화, 팩토리 메소드 패턴과 추상 팩토리 패턴의 차이는 추상화된 그룹을 형성하고 관리하는 것
- 'abstract factory' 는 생성해야될 각각의 객체마다 하위 클래스(factory)를 생성하여, 원하는 하위 클래스(factory)를 결합하도록 하는 방식이다. (다형성 활용) → 복수의 하위 클래스(factory) 를 갖는 구조
- 'abstract factory' 는 여러 개의 팩토리 메소드를 그룹으로 묶은 것과 유사
- 'abstract factory' 는 복수의 그룹을 관리
- 'factory method' 는 추상화를 통해 하위 클래스에게 구현을 위임하며, 1개의 하위 클래스 안에서 매개 변수를 통해 조건에 따라 각각의 객체를 생성한다. (다형성 배제 방법)
- 'factory method' 는 객체 생성을 담당하는 클래스를 추상화하여 선언과 구현을 분리한 확장 패턴
- 'factory method' 는 단일 그룹 관리
Abstract Factory Pattern example diagram
Abstract Factory Pattern example code
package Pack;
///////////////////////////////////////////////////////////////////////////////////////////////
// 키보드과 마우스 인터페이스 - 키보드와 마우스 연결 필요
interface Keyboard{ void connect_Keyboard(); }
interface Mouse{ void connect_Mouse(); }
// factory는 '공장'이란 뜻이고, 공장은 물건을 만드는 곳이다.
// factory method 패턴은 상위 클래스에서 객체를 생성하는 인터페이스를 정의하고,
// 하위 클래스에서 인스턴스를 생성하도록 하는 방식이다.
// Gui 만드는 곳으로, 키보드과 마우스를 생성 필요
interface GuiFactory{
Keyboard createKeyboard();
Mouse createMouse();
}
///////////////////////////////////////////////////////////////////////////////////////////////
// 삼성 Gui 만드는 곳은 Gui 만드는 곳의 조언대로 키보드과 마우스 생성을 하라는 말을 들음
class SamsungGuiFactory implements GuiFactory{
@Override
public Keyboard createKeyboard() { return new SamsumgKeyboard(); } // 삼성용 키보드 생성
@Override
public Mouse createMouse() { return new SamsumgMouse(); } // 삼성용 마우스 생성
}
// 아마존 Gui 만드는 곳은 Gui 만드는 곳의 조언대로 키보드과 마우스를 생성을 하라는 말을 들음
class AmazoneGuiFactory implements GuiFactory{
@Override
public Keyboard createKeyboard() { return new AmazoneKeyboard(); } // 아마존용 키보드 생성
@Override
public Mouse createMouse() { return new AmazoneMouse(); } // 아마존용 마우스 생성
}
///////////////////////////////////////////////////////////////////////////////////////////////
// 삼성용 키보드 생성하기 위해 키보드의 조언을 구하여 키보드 연결하라고 지시 받음
class SamsumgKeyboard implements Keyboard{
@Override
public void connect_Keyboard() {
System.out.println("삼성 키보드 연결");
}
}
// 삼성용 마우스 생성하기 위해 마우스 조언을 구하여 마우스 연결하라고 지시 받음
class SamsumgMouse implements Mouse{
@Override
public void connect_Mouse() {
System.out.println("삼성 마우스 연결");
}
}
// 아마존용 키보드 생성하기 위해 키보드의 조언을 구하여 키보드 연결하라고 지시 받음
class AmazoneKeyboard implements Keyboard{
@Override
public void connect_Keyboard() {
System.out.println("아마존 키보드 연결");
}
}
// 아마존용 마우스 생성하기 위해 마우스 조언을 구하여 마우스 연결하라고 지시 받음
class AmazoneMouse implements Mouse{
@Override
public void connect_Mouse() {
System.out.println("아마존 마우스 연결");
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
public class Hello {
static void print_factory(GuiFactory factory) {
Keyboard Keyboard = factory.createKeyboard();
Mouse Mouse = factory.createMouse();
Keyboard.connect_Keyboard();
Mouse.connect_Mouse();
}
public static void main(String[] args) {
// 삼성 구이 만드는 곳에서 키보드과 마우스를 만듦
GuiFactory SamsungGuiFactory = new SamsungGuiFactory();
print_factory(SamsungGuiFactory);
System.out.println("삼성 컴퓨터 완성");
System.out.println("===============================");
// 아마존 구이 만드는 곳에서 키보드과 마우스를 만듦
GuiFactory AmazoneGuiFactory = new AmazoneGuiFactory();
print_factory(AmazoneGuiFactory);
System.out.println("아마존 컴퓨터 완성");
}
}
# 참고 사이트
- https://ko.wikipedia.org/wiki/%EC%B6%94%EC%83%81_%ED%8C%A9%ED%86%A0%EB%A6%AC_%ED%8C%A8%ED%84%B4
- https://beomseok95.tistory.com/243
- https://ocwokocw.tistory.com/87
- 개발자가 반드시 정복해야할 객체 지향과 디자인 패턴 [인투북스, 최범균]
- 쉽게 배워 바로 써먹는 디자인 패턴 [한빛미디어, 이호진]
728x90
'IT > Design Pattern' 카테고리의 다른 글
[디자인패턴] 프록시(Proxy) (0) | 2022.06.18 |
---|---|
[디자인 패턴] 기본 개념 (0) | 2021.10.04 |
[디자인 패턴] 빌더(Builder) (0) | 2021.10.02 |