본문 바로가기

Design Pattern

[Design Pattern] 20. Factory Method Pattern(팩토리 메소드 패턴) C#

728x90

부모 클래스에서 객체를 생성할 수 있는 인터페이스를 제공나 자식 클래스가 생성될 객체들의 유형을 변경할 수 있도록 도와주는 디자인 패턴입니다.

 

생성 패턴(Creational Design Patterns) 중 하나입니다.

 

 

장점

  • 생성하는 클래스와 생성된 클래스가 느슨한 결합을 유지할 수 있습니다.
  • 단일 책임 원칙을 만족하여 생성하는 클래스의 코드를 프로그램의 한 위치로 이동하여 코드를 더 쉽게 유지관리할 수 있습니다.
  • 개방/폐쇄 원칙을 만족하여 기존 코드를 변경하지 않고 새로운 유형의 클래스를 추가할 수 있습니다.

단점

  • 가장 좋은 방법은 크리에이터 클래스들의 기존 계층구조에 패턴을 도입하는 것입니다.

 

C#으로 Console 프로젝트를 하나 생성해서 할 것입니다.

이번엔 AnimalFactory에서 Dog와 Cat 인스턴스를 생성해 울음 소리 출력하겠습니다.

 

일단 프로젝트의 tree구조는 아래와 같습니다.

FactoryMethod(Project)

|- Program.cs (Main)

|- IAnimal.cs (Interface Animal)

|- Dog.cs (Concreate Animal)

|- Cat.cs (Concreate Animal)

|- AnimalFactory.cs (Factory)

 

 

IAnimal.cs

namespace FactoryMethod
{
    public interface IAnimal
    {
        void Speak();
    }
}

말할 수 있도록 Speak메소드를 구성해줍니다.


Dog.cs

using System;

namespace FactoryMethod
{
    public class Dog : IAnimal
    {
        public void Speak()
        {
            Console.WriteLine("Woof!");
        }
    }
}

개는 Woof!라고 출력하도록 만들어 줍니다.

Cat.cs

using System;

namespace FactoryMethod
{
    public class Cat : IAnimal
    {
        public void Speak()
        {
            Console.WriteLine("Meow!");
        }
    }
}

고양이는 Meow!를 출력하도록 구현해줍니다.

AnimalFactory.cs

using System;

namespace FactoryMethod
{
    public class AnimalFactory
    {
        public IAnimal CreateAnimal(string animalType)
        {
            switch (animalType.ToLower())
            {
                case "dog":
                    return new Dog();
                case "cat":
                    return new Cat();
                default:
                    throw new ArgumentException("Invalid animal type");
            }
        }
    }
}

animalType을 입력받아 생성할 자식 클래스를 지정해줍니다.

만약  해당되지 않는 입력이 들어오면 ArgumentExceotion을 던집니다.

Program.cs 

namespace FactoryMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            AnimalFactory animalFactory = new AnimalFactory();

            IAnimal dog = animalFactory.CreateAnimal("dog");
            IAnimal cat = animalFactory.CreateAnimal("cat");

            dog.Speak();
            cat.Speak();
        }
    }
}

AnimalFactory를 생성해준뒤 Dog와 Cat을 만듭니다. 만들어진 객체에서 Speak을 호출하면 아래와 같이 원하는 대로 출력됨을 확인 하실 수 있습니다.

 

실행 결과

 

생성하는 클래스를 만듦으로 여러모로 편리하게 사용할 수 있습니다.