추상 팩토리 패턴은 서로 연관성 있는 다양한 객체를 생성하는 인터페이스(규격화 된 형식)를 제공하는 패턴이다.
확장성에 용의하기 때문에 다양한 서브클래스를 생성해야할 때 유용한 패턴이다.
아래와 같은 구조를 띈다.

▷ Abstract Factory 실제 팩토리 클래스의 인터페이스
▷ ConcreteFactory: 구체적인 팩토리 클래스로 Abstract Factory 클래스의 투상 메서드를 오버라이드 함으로써 구체적인 제품을 생성한다.
▷ AbstractProduct: 제품의 공통 인터페이스
▷ Product: 구체적인 팩도리 클래스에서 생성되는 구체적인 제품
Client를 만들 때는 추상 팩토리를 바탕으로 만든다. 실제 팩토리는 실행할 때 결정된다.
AbstractFactory는 모든 구상 팩토리에서 구현해야하는 인터페이스이다. 제품을 생산하기 위한 일련의 메소드들이 정의한다. ConcreteFactory에서 서로 다른 제품군을 구현한다. 클라이언트에서 제품이 필요하면 이 팩토리 가운데 적당한것을 골라 쓰면 되기 때문에 제품 객체의 인스턴스를 직접 만들 필요가 없게 된다.
AbstractProduct와 Product에서 필요한 제품들을 생성할 수 있다.
구현
시나리오 :
카페에서 음료(아메리카노, 라떼, 생과일주스 등)을 주문을 받고 음료를 제조한뒤 음료를 손님에게 건낸다.
주문과 음료 수령은 공통적인 기능이고 음료에 따라 제조하는 과정이 다르다.

class Service
{
public Service()
{
giveService();
checkService();
}
public void giveService()
{
Console.WriteLine("주문하신 음료 나왔습니다. ");
}
public void checkService()
{
Console.WriteLine("매출 +1 !!!!!!!!!!!!🥨🥨 ");
}
}}
public abstract class Beverage
{
private bool mIsCold;
public Beverage(bool isCold)
{
if (isCold)
{
iceBeverage();
}
else
{
hotBeverage();
}
}
protected abstract void iceBeverage();
protected abstract void hotBeverage();
}
public abstract class Order
{
public void comeGuest()
{
Console.WriteLine("손님왔다");
}
protected abstract void getOrder();
}
class CoffeeBeverage : Beverage
{
public CoffeeBeverage(bool isCold) : base(isCold) { }
protected override void hotBeverage()
{
Console.WriteLine("물을 팔팔 끓이고 ");
Console.WriteLine("커피 내리고");
Console.WriteLine("뜨거운 물 +커피");
}
protected override void iceBeverage()
{
Console.WriteLine("얼음 준비하고 ");
Console.WriteLine("커피내리고");
Console.WriteLine("얼음 + 커피");
}
}
class CoffeeOrder : Order
{
public CoffeeOrder()
{
getOrder();
}
protected override void getOrder()
{
Console.WriteLine("커피 주문 완료되었습니다. ");
}
}
class CoffeeFactory : BeverageFactory
{
private bool isCold;
public CoffeeFactory(bool iscold)
{
isCold = iscold;
}
public override Beverage createBeverage()
{
return new CoffeeBeverage(isCold);
}
public override Order createOrder()
{
return new CoffeeOrder();
}
public override Service createService()
{
return new Service();
}
}
Fruit Factory도 생성하여 CoffeeFactory처럼 구현한다.
abstract class BeverageFactory
{
public abstract Order createOrder();
public abstract Beverage createBeverage();
public abstract Service createService();
}
class Program
{
static void Main(string[] args)
{
BeverageFactory[] cf = new BeverageFactory[2];
cf[0] = new CoffeeFactory(true);
cf[1] = new FruitFactory(true);
//이게 핵심!!!!!!!!!!!!!!!!
foreach (var item in cf)
{
item.createOrder();
item.createBeverage();
item.createService();
}
Console.Read();
}
}
추상팩토리 패턴은 연관된 모든 객체들을 실행 및 확인 할 때 유용하다.
(나중에 다시 확인해봐야갰다)
'STUDY > Design Pattern' 카테고리의 다른 글
어댑터 패턴 (Adapter pattern) (0) | 2022.11.27 |
---|---|
단일체 패턴(Singleton Pattern) (0) | 2022.11.27 |
원형 패턴 (Prototype Pattern) (0) | 2022.11.27 |
팩토리 메소드 패턴 (Factory Method Pattern) (0) | 2022.11.27 |
빌더 패턴 (Builder Pattern) (0) | 2022.11.27 |