팩토리 메소드 디자인 패턴은 객체 생성 코드를 클라이언트 코드에 긴밀하게 연결하지 않고도 객체를 생성할 수 있도록 하는 생성 패턴입니다. 이는 슈퍼클래스에서 객체를 생성하기 위한 인터페이스를 정의하지만 하위 클래스가 인스턴스화할 클래스를 결정할 수 있도록 합니다.
Factory Pattern과 Factory Method Pattern의 차이.
팩토리 패턴과 팩토리 메소드 패턴이 다르다는 점을 말 하는 것으로 시작하겠습니다. 둘 다 객체 생성과 관련되어 있지만 서로 다른 용도로 사용되며 구조도 다릅니다.
Factory Design Pattern (Simple Factory Pattern)
- 목적: 클라이언트 코드를 개체 생성 코드에서 분리하여 개체 생성 프로세스를 캡슐화합니다.
- 구조:
- Factory: 객체를 생성하는 클래스입니다. 이 클래스는 클라이언트에 객체를 반환하는 메서드를 제공합니다.
- 제품: 생성되는 객체의 유형을 나타내는 추상 클래스 또는 인터페이스입니다. 구체적인 객체는 이 인터페이스를 구현합니다.
- ConcreteProduct: 생성되는 실제 개체입니다. Factory는 이러한 객체를 생성하고 반환합니다.
- 사용 예: 예를 들어 다양한 유형의 모양을 생산하는 공장을 만들 수 있습니다. Factory는 클라이언트에게 원, 직사각형 또는 삼각형을 반환할 수 있습니다.
Factory Method Design Pattern
- 목적: 객체 생성을 하위 클래스로 연기합니다. 슈퍼클래스는 객체를 생성하기 위한 인터페이스를 정의하고, 서브클래스는 객체를 생성하기 위해 이 인터페이스를 구현합니다.
- 구조:
- Creator(Abstract Creator): 객체 생성을 담당하는 추상 클래스 또는 인터페이스입니다. 팩토리 메소드를 선언합니다.
- ConcreteCreator: 실제로 객체를 생성하는 클래스입니다. 객체를 반환하는 팩토리 메서드를 구현합니다.
- 제품: 생성되는 객체의 유형을 나타내는 추상 클래스 또는 인터페이스입니다. 구체적인 객체는 이 인터페이스를 구현합니다.
- 사용 예: 이 프로젝트에 설명된 신용 카드 예는 팩토리 메소드 디자인 패턴의 인스턴스입니다. 각 신용카드 유형에는 해당하는 Factory가 있으며, Factory 메서드는 특정 신용카드를 생성합니다.
Class Diagram


Code
ICreditCard.cs
public interface ICreditCard
{
string GetCardType();
double GetCreditLimit();
double GetAnnualCharge();
}
C#MoneyBack.cs
public class MoneyBack : ICreditCard
{
public string GetCardType() => "MoneyBack";
public double GetCreditLimit() => 15000;
public double GetAnnualCharge() => 500;
}
C#Platinum.cs
public class Platinum : ICreditCard
{
public string GetCardType() => "Platinum";
public double GetCreditLimit() => 50000;
public double GetAnnualCharge() => 3000;
}
C#Titanium.cs
public class Titanium : ICreditCard
{
public string GetCardType() => "Titanium";
public double GetCreditLimit() => 25000;
public double GetAnnualCharge() => 1500;
}
C#CreditCardFactory.cs
public abstract class CreditCardFactory
{
public abstract ICreditCard CreateProduct();
}
C#MoneyBackFactory.cs
public class MoneyBackFactory : CreditCardFactory
{
public override ICreditCard CreateProduct() => new MoneyBack();
}
C#PlatinumFactory.cs
public class PlatinumFactory : CreditCardFactory
{
public override ICreditCard CreateProduct() => new Platinum();
}
C#TitaniumFactory.cs
public class TitaniumFactory : CreditCardFactory
{
public override ICreditCard CreateProduct() => new Titanium();
}
C#Program.cs
var moneyBackFactory = new MoneyBackFactory();
var moneyBackCard = moneyBackFactory.CreateProduct();
Console.WriteLine($"Card Type: {moneyBackCard.GetCardType()}, Limit: {moneyBackCard.GetCreditLimit()}, Annual Charge: {moneyBackCard.GetAnnualCharge()}");
C#Run

요약
이번 글에서는 팩토리 메소드 디자인 패턴(Factory Method Design Pattern)에 대해 알아보았습니다. 이 패턴은 개체 생성을 하위 클래스에 위임하여 클라이언트 코드와 개체 생성 코드를 분리하는 데 도움이 됩니다. 각 패턴은 특정 상황에 맞게 유연하게 사용할 수 있으며 코드의 확장성과 유지 관리성을 향상시키는 데 기여합니다.
Links
- https://github.com/daemdk/tedscodes/tree/main/day11-factory-method-pattern
- https://learn.microsoft.com/en-us/shows/visual-studio-toolbox/design-patterns-factories (This article has good content about Simple Factory, Factory Method, and Abstract Factory.)