팩토리 패턴
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 70개 중 53번째.
Factory 패턴은 객체 생성을 별도의 메서드나 클래스에 위임하는 생성 패턴입니다. 코드에서 new를 직접 사용하는 대신, 팩토리에 객체를 생성해 달라고 요청합니다. 이렇게 하면 생성 로직이 중앙 집중화되고 코드가 더 유연해집니다.
다양한 유형의 문서를 생성해야 하는 상황을 생각해 보세요. 팩토리가 없으면 코드가 특정 클래스에 강하게 결합됩니다:
// Factory 없이 - 분산된 생성 로직
IDocument doc;
if (type == "pdf")
doc = new PdfDocument();
else if (type == "word")
doc = new WordDocument();팩토리는 이러한 의사 결정을 한곳에 캡슐화합니다.
public interface IDocument
{
void Open();
}
public class PdfDocument : IDocument
{
public void Open() => Console.WriteLine("Opening PDF");
}
public class WordDocument : IDocument
{
public void Open() => Console.WriteLine("Opening Word");
}
public class DocumentFactory
{
public IDocument Create(string type)
{
switch (type)
{
case "pdf":
return new PdfDocument();
case "word":
return new WordDocument();
default:
throw new ArgumentException("Unknown type");
}
}
}이제 클라이언트 코드는 구체적인 클래스를 알지 못해도 필요한 것을 간단히 요청합니다:
var factory = new DocumentFactory();
IDocument doc = factory.Create("pdf");
doc.Open(); // PDF 열기Factory 패턴은 나중에 새로운 유형을 추가해야 할 때 특히 유용합니다. SpreadsheetDocument를 추가하려면 문서가 생성되는 모든 곳이 아니라 팩토리만 변경하면 됩니다. 이러한 분리를 통해 코드베이스를 더 쉽게 유지 관리하고 테스트할 수 있습니다.
챌린지
쉬움팩토리 패턴을 사용하여 알림 시스템을 만들어 봅시다. 코드 전체에서 서로 다른 알림 유형을 직접 생성하는 대신, 간단한 문자열 식별자를 기반으로 어떤 알림을 생성할지 결정하는 팩토리 클래스에 생성 로직을 중앙화합니다.
코드를 세 개의 파일로 구성합니다.
Notification.cs:Notifications네임스페이스에INotification인터페이스를 정의하고, 문자열을 반환하는 단일 메서드Send(string message)를 선언합니다. 그런 다음 이 인터페이스를 구현하는 세 개의 클래스를 만듭니다.EmailNotification-"Email: {message}"를 반환합니다.SmsNotification-"SMS: {message}"를 반환합니다.PushNotification-"Push: {message}"를 반환합니다.
NotificationFactory.cs: 같은 네임스페이스에NotificationFactory클래스를 만들고, type 문자열에 따라 적절한INotification을 반환하는Create(string type)메서드를 정의합니다."email"은EmailNotification을 반환합니다."sms"는SmsNotification을 반환합니다."push"는PushNotification을 반환합니다.
EmailNotification을 반환합니다.Program.cs: 팩토리 인스턴스를 만들고 이를 사용하여 입력에 따라 알림을 생성함으로써 모든 것을 하나로 연결합니다. 어떤 구체 클래스를 인스턴스화할지에 대한 모든 결정은 팩토리가 처리합니다.
두 개의 입력을 받습니다.
- 알림 유형(예:
sms) - 보낼 메시지(예:
Your order has shipped)
팩토리를 사용하여 적절한 알림 유형을 생성한 다음, 메시지와 함께 해당 알림의 Send 메서드를 호출하고 결과를 출력합니다.
예를 들어 입력이 push와 Meeting in 5 minutes라면 출력은 다음과 같아야 합니다.
Push: Meeting in 5 minutes메인 코드에서는 new EmailNotification() 또는 이와 유사한 코드를 전혀 사용하지 않는다는 점에 주목하세요. 메인 코드는 단순히 팩토리에 필요한 것을 요청합니다. 나중에 SlackNotification을 추가하더라도 알림을 생성하는 모든 부분이 아니라 팩토리만 업데이트하면 됩니다!
직접 해보기
using System;
using Notifications;
class Program
{
public static void Main(string[] args)
{
// 입력 읽기
string type = Console.ReadLine();
string message = Console.ReadLine();
// TODO: NotificationFactory 인스턴스 생성
// TODO: 팩토리를 사용하여 적절한 알림 생성
// TODO: Send 메서드를 호출하고 결과 출력
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C# 컴파일러