일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- infcon 2024
- 디자인패턴
- TiL
- 1주일회고
- 파이썬
- @FeignClient
- Python
- KPT회고
- 항해99
- 빈 충돌
- 빈 조회 2개 이상
- 단기개발자코스
- 프로그래머스 이중우선순위큐
- spring batch 5.0
- 인프콘 2024
- 구글 OAuth login
- 전략패턴 #StrategyPattern #디자인패턴
- DesignPattern
- 디자인 패턴
- 커스텀 헤더
- 99클럽
- Spring multimodule
- 프로그래머스
- JavaScript
- 코딩테스트 준비
- 취업리부트코스
- jwt
- 개발자 취업
- 개발자부트캠프추천
- jwttoken
- Today
- Total
m1ndy5's coding blog
추상 팩토리 패턴(Abstract Factory Pattern) 본문
추상 팩토리 패턴 정의
연관성이 있는 객체 군이 여러개 있을 경우 이들을 묶어 추상화하고, 어떤 구체적인 상황이 주어지면 팩토리 객체에서 집합으로 묶은 객체 군을 구현화 하는 생성 패턴 -> 다양한 구성 요소 별로 '객체의 집합'을 생성해야 할 때 유용
원재료 팩토리 만들기
피자를 만들 때 들어가는 토핑이 조금씩 다르다고 생각해보자.
일단 각 재료를 공급하는 Factory를 만들어보자
public interface PizzaIngredientFactory{
public Dough createDough();
public Sauce createSauce();
public Cheese createCheese();
public Veggies[] createVeggies();
}
이 안의 메소드를 전부 추상으로 만든 이유는 각 스토어에서 쓰는 재료의 종류가 다를 것이기 때문이다.
예를들어 어떤 곳은 토마토 소스를 쓰고 어떤 곳은 크림 소스를 쓰고 이런식으로
그럼 이제 각 지역의 재료 팩토리를 구현해보자
public class NYPizzaIngredientFactory implements PizzaIngredientFactory{
public Dough createDough(){
return new ThinCrustDough();
}
public Sauce createSauce(){
return new MarinaraSauce();
}
public Cheese createCheese(){
return new ReggianoCheese();
}
public Veggies[] createVeggies(){
return {new Garlic(), new Onion()};
}
}
다른 지역 IngredientFactory는 다른 재료의 구상클래스로 이루어질 것이다.
이 재료들로 이루어진 Pizza 추상 클래스를 만들어 보자
public abstract class Pizza{
Dough dough;
Sauce sauce;
Veggies veggies[];
Cheese cheese;
// 피자에 필요한 재료들을 가져오는 추상 메소드
abstract void prepare();
}
public class CheesePizza extends Pizza{
PizzaIngredientFactory ingredientFactory;
public CheesePizza(PizzaIngredientFactory ingredientFactory){
this.ingredientFactory = ingredientFactory;
}
@Override
void prepare(){
dough = ingredinentFactory.createDough();
sauce = ingredinentFactory.createSauce();
cheese = ingredinentFactory.createCheese();
}
}
이제 이렇게 만든 치즈 피자를 NYPizzaStore에서 만들어보자
public class NYPizzaStore extends PizzaStore{
protected Pizza createPizza(String item){
Pizza pizza;
PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
if(item.equals("Cheese")){
pizza = new CheesePizza(ingredientFactory);
}
}
}
public class Main{
public static void main(String[] args){
PizzaStore pizzaStore = new NYPizzaStore();
// NYPizzaStore은 NYPizzaIngredientFactory의 재료를 사용하기 때문에 NYPizzaIngredientFactory의 재료로 만들어진 CheesePizza가 만들어지게 된다.
Pizza pizza = pizzaStore.orderPizza("Cheese");
}
}
팩토리 메소드 패턴 VS 추상 팩토리 패턴
팩토리 메서드 예시
PizzaStore라는 Pizza를 생산하는 데 필요한 추상 인터페이스를 제공
NYPizzaStore과 ChicagoPizzaStore과 같은 각 서브클래스에서 어떤 클래스의 인스턴스를 만들지 결정
createPizza()가 팩토리 메서드였음
Pizza라는 추상 클래스를 구현한 다양한 피자들이 각 store의 createPizza()에서 만들어짐
추상 팩토리 예시
PizzaIngredientFactory라는 제품군(원재료들)을 생산하는 추상 인터페이스를 제공
NYPizzaIngredientFactory와 ChicagoPizzaIngredientFactory같은 서브클래스에서 제품군을 생산함
Dough의 종류, Clams의 종류 등 다양한 제품군을 결정할 수 있음
또한 추상팩토리에서 팩토리 메소드를 사용할 수 있음
'백엔드 with java > Design Pattern' 카테고리의 다른 글
어댑터 패턴 Adapter Pattern (0) | 2023.12.16 |
---|---|
싱글톤(Singleton) feat. 스프링 (0) | 2023.12.04 |
팩토리 메소드 패턴(Factory Method Pattern) (0) | 2023.11.26 |
데코레이터 패턴(Decorator Pattern) (1) | 2023.11.23 |
옵저버 패턴(Observer Pattern) (1) | 2023.11.22 |