STUDY/Design Pattern

팩토리 메소드 패턴 (Factory Method Pattern)

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

팩토리 메소드는 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 정의하는 캡술화하는 패턴이다.

이 패턴은 추상적인 클래스를 통해 실제 구현 대상인 Concrete와 Client 간의 결합도를 낮춘다.

구조

▷ Product : 팩토리 메소드로 생성될 객체의 공통 인터페이스

▷ ConcreteProduct : 구체적으로 객체가 생성되는 클래스

▷ Creator : 팩토리 메소드를 갖는 클래스

▷ ConcreteCreator : 팩토리 메소드를 구현하는 클래스로 ConcreteProduct 객체를 생성

Product와 ConcreteProduct를 dll로 구성하고 이를 ConcreteCreator에서 사용하면 결합도를 낮출 수 있다.

구현

 

구현 코드 >>>>

  interface Pizza
    {
        void prepare();
        void bake();
        void packing();

    }
  abstract class PizzaStore
    {
        public Pizza orderPizza(string type) 
        {
            //factory 매소드 사용
            Pizza pizza = createPizza(type);
            pizza.prepare();
            pizza.bake();
            pizza.packing();

            return pizza;
        }

        //factory method 
        public abstract Pizza createPizza(string type);
    }
    class MrsPizzaStore : PizzaStore
    {
        public override Pizza createPizza(string type)
        {
            if (type.Equals("Cheese"))
            {
                return new MrsPizzaCheese();
            }
            else if (type.Equals("Hawaiian"))
            {
                return new MrsPizzaHawaiian();
            }
            return null;
        }
    }
  class MrsPizzaCheese : Pizza
    {
        public void bake()
        {
            Console.WriteLine("짭쪼름한 치즈가 가득한 치즈피자가 구워지는 중 ... 🍕");
        }

        public void packing()
        {
            Console.WriteLine("짭쪼름한 치즈가 가득한 치즈피자 포장 중  ... 🍕");
        }

        public void prepare()
        {
            Console.WriteLine("준비중입니다. ");
        }
    }
    class MrsPizzaHawaiian : Pizza
    {
        public void bake()
        {
            Console.WriteLine("단짠의 최강자 하와이안 피자가 구워지는 중 ... 🍕");
        }

        public void packing()
        {
            Console.WriteLine("단짠의 최강자 하와이안 피자 포장 중  ... 🍕");
        }

        public void prepare()
        {
            Console.WriteLine("준비중입니다. ");
        }
    }
  static void Main(string[] args)
        {
            PizzaStore pizza = new MrPizzaStore();


            pizza.createPizza("Cheese");
            pizza.orderPizza("Cheese");
        }

결과값 >>>>

팩토리 메소드는 서브 클래스로 인해 객체의 자료형이 결정되기 때문에 확장성 있는 프로그램 뼈대를 만들 때 유 용하다.

그러나 객체가 늘어날 때마다 서브 클래스 재정의로 인한 불필요한 클래스 생성할 가능성이 있다.

이름이 비슷한 팩토리 메소드 패턴과 추상 팩토리 패턴의 공통점과 차이점은 무엇일까??

◆공통점

- Factory 클래스를 사용하여 생성

- 추상클래스와 인터페이스를 이용함

- 캡슐화

◆차이점

- 팩토리 메소드에서 만드는 객체의 종류

→ 팩토리 매소드 패턴

인자에 따라 객체의 종류가 결정 됨

→ 추상 팩토리 패턴

인자에 따라 관련 된 객체를 생성하는 팩토리의 종류가 결정 됨.

- 결합도 낮추는 대상

→ 팩토리 매소드 패턴

ConcreteProduct와 Client 간의 결합도를 낮출 때 사용

→ 추상 팩토리 패턴

ConcreteFactory와 Client간의 결합도를 낮출 때 사용

- 결합도 낮추는 대상

→ 팩토리 매소드 패턴

ConcreteProduct와 Client 간의 결합도를 낮출 때 사용

→ 추상 팩토리 패턴

ConcreteFactory와 Client간의 결합도를 낮출 때 사용

팩토리 메소드 패턴은 마치 '상품 A를 만들어줘' 와 같은 패턴이고

추상팩토리 패턴은 마치 '상품A를 만들 수 있는 공장을 찾아줘'라는 패턴이다.

728x90