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 |
---|