728x90
"찐빵님, 지금 객체 생성 함수가 세 개 있잖아요, 그거 팩토리로 바꿔서 PR 해주세요"
??? 팩토리 패턴이 뭐지??? 팩토리 패턴이 뭔지 몰라서 공부해봤다.
팩토리 메서드 패턴
조건에 따라 객체를 다르게 생성해야 할 때, 조건문을 사용해서 분기 처리를 하는데,
분기에 따른 객체의 생성을 직접 하지 않고, 팩토리 클래스에 위임해서 그 안에서 객체를 생성하도록 하는 방식이다.
객체를 찍어내는 공장이기 때문에 "팩토리"라는 이름이 붙었나 보다.
팩토리를 왜 사용할까?
SNS 클래스를 만들고, 트위터, 페이스북, 인스타그램을 생성해봤다.
public abstract class SNS
{
}
public Twitter()
{
Console.WriteLine("Twitter");
}
public Facebook()
{
Console.WriteLine("Facebook");
}
public Instagram()
{
Console.WriteLine("Instagram");
}
만약 내가 입력에 따른 다른 SNS를 생성하고 싶을 때, 아래처럼 분기 처리를 해서 해결할 수 있다.
switch (type)
{
case "Twitter":
return new Twitter();
break;
case "Facebook":
return new Facebook();
break;
case "Instagram":
return new Instagram();
break;
default:
return null;
}
그런데 여러 위치에서 같은 일을 반복해야 한다면?
위 switch문이 여러 위치에 있게 되어 중복되는 코드가 발생하고 지저분해 보일 것이다.
만약 KakaoTalk이라는 SNS의 한 종류가 추가된다면 모든 switch문에서 KakaoTalk을 추가해줘야 하는 번거로움이 있다.
즉, 객체 간의 결합도가 강해지고 유지보수도 어려워진다.
이러한 이유로 팩토리 클래스를 만들어서 분기 처리를 한 곳에서만 할 수 있게 변경한다.
public class SNSFactory
{
public SNS create(string type)
{
switch (type)
{
case "Twitter":
return new Twitter();
break;
case "Facebook":
return new Facebook();
break;
case "Instagram":
return new Instagram();
break;
default:
return null;
}
}
}
생성한 팩토리 클래스를 사용해서 SNS 객체를 만들어보자
static void Main(string[] args)
{
var snsFactory = new SNSFactory();
snsFactory.create("Facebook");
snsFactory.create("Instagram");
}
Result
Facebook
Instagram
이제 분기에 따른 SNS 객체를 생성하는 코드는 SNSFactory 클래스에만 존재한다.
SNS 종류가 추가되어도 여기에서만 변경하면 된다.
다른 클래스에서는 Factory 객체를 만들고 create 함수를 불러주면 되니 깔끔해졌다.
반응형
'개발공부 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] 전략패턴 (Stratege Pattern) (0) | 2023.02.01 |
---|---|
[디자인 패턴] 상태 패턴 (State Pattern) (0) | 2023.01.31 |
옵저버 패턴(Observer Pattern) / 관찰자 디자인 패턴 (0) | 2022.01.10 |
[디자인 패턴] 객체지향의 4대 특징 (0) | 2021.10.31 |
MVVM 패턴이란? (0) | 2021.10.26 |