STUDY/Design Pattern

추상 팩토리 패턴 (Abstract Factory Pattern)

디리릭 2022. 11. 27. 18:51
728x90

추상 팩토리 패턴은 서로 연관성 있는 다양한 객체를 생성하는 인터페이스(규격화 된 형식)를 제공하는 패턴이다.

확장성에 용의하기 때문에 다양한 서브클래스를 생성해야할 때 유용한 패턴이다.

아래와 같은 구조를 띈다.


▷ 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();
        }
    }

 

 

추상팩토리 패턴은 연관된 모든 객체들을 실행 및 확인 할 때 유용하다.

(나중에 다시 확인해봐야갰다)

728x90