디자인 패턴

Factory Pattern 팩토리 패턴

kark 2024. 8. 8. 14:38
728x90

객체 생성의 세부사항을 외부로 노출하지 않고 상위 클래스, 인터페이스를 통해 객체를 생성하는 디자인 패턴

객체 생성 로직을 캡슐화 하여 코드의 유연성, 확장성을 높이는데 도움이 됨

 

생성 패턴의 기본이 되는 심플 팩토리 구조이다.

즉, 객체 생성을 대신해주는 별도의 객체가 있다고 생각하면 되겠다.

 

만약 클라이언트가 모든 객체를 직접 생성하고, 별도의 설정을 전부 직접 해줘도 상관은 없다.

하지만 각 설정이 정규화 되어있다면 매번 반복적인 작업을 할 필요가 있을까?

 

또한 모든 객체에 변경점이 생겼을 때 모든 객체에 직접 수정을 해줘야한다면 유지보수성에 문제가 될 수 있다.

클라이언트가 직접 생성한다면?

 

위의 그림처럼 공장처럼 요구사항에 맞게 대신 제작해주는 객체가 있다고 보자.

 

클라이언트의 요구사항에 맞게 원하는 객체를 받아낼 수 있으며

가장 큰 차이점은 공장내부에서 설정으로 인해 클라이언트가 개별적인 객체에 별도의 설정을 하지 않아도 된다.

 

만약 생성되는 객체의 초기 설정을 변경해야한다면 공장 내부의 설정값만 바꿔주면 된다.

 

팩토리의 내부 모습

 

간단한 팩토리 기본구조

 

 

<동물 클래스>

public enum AnimalType
{
    Dog,
    Cat,
}

public enum AnimalColor
{
    Black,
    White,
}

public class Animal
{
    private string _name;
    private int _age;
    private AnimalColor _color;

    public string Name => _name;
    public int Age => _age;
    public AnimalColor Color => _color;

    public Animal(string m_name, int m_age, AnimalColor m_color)
    {
        this._name = m_name;
        this._age = m_age;
        this._color = m_color;
    }
}

public class Dog : Animal
{
    public Dog(string m_name, int m_age, AnimalColor m_color) : base(m_name, m_age, m_color)
    {
    }
}

public class Cat : Animal
{
    public Cat(string m_name, int m_age, AnimalColor m_color) : base(m_name, m_age, m_color)
    {
    }
}

 

 

<팩토리 클래스>

public class Factory
{
    public T CreateAnimal<T>(AnimalType m_type) where T : Animal
    {
        switch (m_type)
        {
            case AnimalType.Dog:
                {
                    Animal newDog = new Dog("강아지", 3, AnimalColor.Black);
                    // 강아지 객체에 대한 추가 작업 1
                    // 강아지 객체에 대한 추가 작업 2
                    // 강아지 객체에 대한 추가 작업 3
                    return (T)newDog;
                }
            case AnimalType.Cat:
                {
                    Animal newCat = new Cat("고양이", 2, AnimalColor.White);
                    // 고양이 객체에 대한 추가 작업 1
                    // 고양이 객체에 대한 추가 작업 2
                    return (T)newCat;
                }
        }

        return null;
    }
}

 

 

<클라이언트>

Factory animalFactory = new Factory();
Animal myDog = animalFactory.CreateAnimal<Animal>(AnimalType.Dog);
Animal myCat = animalFactory.CreateAnimal<Animal>(AnimalType.Cat);

Dog dog = animalFactory.CreateAnimal<Dog>(AnimalType.Dog);
Cat cat = animalFactory.CreateAnimal<Cat>(AnimalType.Dog);

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

Builder Pattern 빌더 패턴  (0) 2024.08.08