[디자인 패턴] AbstractFactory 패턴

이멀젼씨

·

2020. 3. 11. 11:57

- 정의

 

서로 관련이 있는 객체들을 묶고 조건에 따라 관련된 객체들을 한꺼번에 객체를 생성하는 패턴이다

 

- UML

 

 

1. Food인터페이스를 만들고 이를 구현하는 WinterFood와 SummerFood클래스를 만든다

2. Clothes인터페이스를 만들고 이를 구현하는 WinterClothes와 SummerClothes클래스를 만든다

3. SeasonPlanFactory인터페이스를 만들고 이를 구현하는 SummerPlan과 WinterPlan클래스를 만들어 계절별로 계획을 실행할 수 있도록 한다

 

- 코드

 

Food interface

public interface Food {
	public void eat();
}

WinterFood class

public class WinterFood implements Food{
	@Override
	public void eat() {
		System.out.println("따뜻한 음식 준비");
	}
}

SummerFood class

public class SummerFood implements Food{
	@Override
	public void eat() {
		System.out.println("시원한 음식 준비");
	}
}

Clothes interface

public interface Clothes {
	public void wear();
}

WinterClothes class

public class WinterClothes implements Clothes{
	@Override
	public void wear() {
		System.out.println("두꺼운 옷 준비");
	}
}

SummerClothes class

public class SummerClothes implements Clothes{
	@Override
	public void wear() {
		System.out.println("얇은 옷 준비");
	}
}

SeasonPlanFactory interface

public interface SeasonPlanFactory {
	public Clothes prepareClothes();
	public Food prepareFood();
}

WinterPlan class

public class WinterPlan implements SeasonPlanFactory{
	@Override
	public Clothes prepareClothes() {
		return new WinterClothes();
	}
	@Override
	public Food prepareFood() {
		return new WinterFood();
	}
}

SummerPlan class

public class SummerPlan implements SeasonPlanFactory{
	@Override
	public Clothes prepareClothes() {
		return new SummerClothes();
	}
	@Override
	public Food prepareFood() {
		return new SummerFood();
	}
}

Main class

public class Main {

	public static void main(String[] args) {
		SeasonPlanFactory seasonPlanFactory;
		
		System.out.println("겨울 준비 계획");
		seasonPlanFactory = new WinterPlan();
		seasonPlanFactory.prepareClothes().wear();
		seasonPlanFactory.prepareFood().eat();
		
		System.out.println();
		
		System.out.println("여름 준비 계획");
		seasonPlanFactory = new SummerPlan();
		seasonPlanFactory.prepareClothes().wear();
		seasonPlanFactory.prepareFood().eat();
	}

}

 

- 설명

'A라는 계획이 세워졌을 때 ~과 ~을 하고, B라는 계획이 세워졌을 때 ~과 ~을 한다'라는 상황에서 사용하면 되겠다

 

팩토리 메서드 패턴과는 다르게 추상 팩토리 패턴은 개별단위가 아니라 전체를 하나의 제품군으로 묶어서 이해하면 될 것 같다

 

위의 예시처럼 여름계획을 세우는 경우엔 짧은 옷과 시원한 음식을 한꺼번에 준비하고, 겨울 계획을 세우는 경우엔 두꺼운 옷과 따뜻한 음식을 준비하는 것처럼 말이다

 

장점

- 제품군 간의 교체가 쉬움

 

단점

- 새로운 제품이 추가되어야 할 경우 모든 Factory클래스를 수정해야 함

'디자인패턴' 카테고리의 다른 글

[디자인 패턴] Composite 패턴  (0) 2020.03.13
[디자인 패턴] Bridge 패턴  (0) 2020.03.12
[디자인 패턴] Builder 패턴  (0) 2020.03.10
[디자인 패턴] ProtoType 패턴  (0) 2020.02.11
[디자인 패턴] Singleton 패턴  (0) 2020.02.10