목차
심플 팩토리(Simple Factory)
Simple Factory 패턴은 객체의 생성을 전담하는 클래스를 사용하여 객체 생성 과정의 복잡성을 감추고, 코드의 유연성과 재사용성을 높이는 디자인 패턴이다. 이 패턴은 객체 생성에 필요한 로직을 캡슐화하여, 클라이언트 코드가 구체적인 클래스 타입에 직접 의존하지 않도록 한다. 즉, 클라이언트는 생성하고자 하는 객체의 정확한 타입을 몰라도, 팩토리를 통해 필요한 객체를 얻을 수 있다.
Simple Factory 패턴은 생성(Creational) 디자인 패턴에 속한다. 이유는 이 패턴이 객체 생성 과정에 초점을 맞추며, 인스턴스화 로직을 클라이언트로부터 분리하여 객체 생성의 책임을 담당하는 클래스(Factory)에 위임하기 때문이다. 따라서, 코드의 유지보수성과 확장성을 높이는 데 유용하다.
어원
'Factory'라는 단어는 '공장'을 의미한다. 즉, Simple Factory 패턴은 객체를 생성하는 공장과 같은 역할을 하는 클래스를 제공한다는 의미에서 이러한 이름이 붙었다. 이 공장(Factory 클래스)은 요청에 따라 다양한 타입의 객체를 '생산'할 수 있다.
패턴 미적용 예시 코드 (C#)
// 상품 인터페이스
public interface IProduct
{
string Operation();
}
// 구체적인 상품 클래스들
public class ConcreteProductA : IProduct
{
public string Operation()
{
return "ConcreteProductA의 연산";
}
}
public class ConcreteProductB : IProduct
{
public string Operation()
{
return "ConcreteProductB의 연산";
}
}
// 클라이언트 코드
class Client
{
static void Main(string[] args)
{
IProduct product;
// 상품 타입 A를 직접 생성
product = new ConcreteProductA();
Console.WriteLine(product.Operation());
// 상품 타입 B를 직접 생성
product = new ConcreteProductB();
Console.WriteLine(product.Operation());
}
}
패턴 미적용 시 문제점
패턴을 적용하지 않을 경우, 클라이언트 코드는 구체적인 상품 클래스에 직접 의존하게 된다. 이는 다음과 같은 문제점을 야기한다:
- 유연성 부족: 새로운 상품타입을 추가하거나 기존 상품 타입을 수정할 때마다 클라이언트 코드도 함께 변경해야 한다. 이는 OCP(Open-Closed Principle, 개방-폐쇄 원칙)를 위반하며, 시스템의 유연성과 확장성을 저하시킨다.
- 코드 중복: 상품 객체를 생성하는 로직이 시스템의 여러 곳에서 중복될 수 있다. 만약 생성 로직이 복잡하다면, 이러한 중복은 유지보수의 부담을 증가시킨다.
- 객체 생성의 복잡성 증가: 클라이언트가 직접 객체를 생성할 경우, 생성 과정에 필요한 모든 세부 정보를 알고 있어야 한다. 이는 객체 생성의 복잡성을 클라이언트에게 전가시키는 결과를 초래한다.
Simple Factory 패턴을 사용함으로써, 이러한 문제점들을 해결할 수 있다. 패턴을 적용하면 객체 생성 로직을 한 곳(Factory 클래스)에 집중시켜 관리할 수 있으므로, 클라이언트는 생성하려는 객체의 구체적인 타입을 몰라도 되며, 시스템의 유연성과 확장성을 크게 향상시킬 수 있다. 또한, 객체 생성에 필요한 세부 사항은 Factory 내부에 캡슐화되어 있기 때문에, 클라이언트 코드는 더욱 단순화되고 유지보수가 용이해진다.
패턴 적용 예시 코드 (C#)
패턴 적용한 경우:
// 상품 인터페이스
public interface IProduct
{
string Operation();
}
// 구체적인 상품 클래스들
public class ConcreteProductA : IProduct
{
public string Operation()
{
return "ConcreteProductA의 연산";
}
}
public class ConcreteProductB : IProduct
{
public string Operation()
{
return "ConcreteProductB의 연산";
}
}
// Simple Factory 클래스
public class SimpleFactory
{
public IProduct CreateProduct(string type)
{
switch (type)
{
case "A":
return new ConcreteProductA();
case "B":
return new ConcreteProductB();
default:
throw new ArgumentException("지원하지 않는 타입", nameof(type));
}
}
}
// 클라이언트 코드
class Client
{
static void Main(string[] args)
{
SimpleFactory factory = new SimpleFactory();
IProduct product = factory.CreateProduct("A");
Console.WriteLine(product.Operation());
}
}
Simple Factory 패턴의 핵심은 "생성에 관련된 코드를 한 곳에 집중시킴으로써, 코드의 중복을 줄이고, 유지보수를 용이하게 하며, 시스템의 유연성과 확장성을 향상시키는 것"이다. 이를 통해 클라이언트 코드는 필요한 객체를 쉽고 간단하게 생성할 수 있으멀로, 전반적인 소프트웨어 설계의 품질이 향상된다.
'컴퓨터 과학 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] 생성 패턴(5) : 프로토타입(Prototype) (0) | 2024.03.24 |
---|---|
[디자인패턴] 생성 패턴(4) : 빌더(Builder) (0) | 2024.03.24 |
[디자인패턴] 생성 패턴(3) : 팩토리 메서드(Factory Method) (0) | 2024.03.24 |
[디자인패턴] 생성 패턴(2) : 추상 팩토리(Abstract Factory) (1) | 2024.03.24 |
[디자인 패턴] 디자인 패턴의 역사와 종류 (0) | 2024.03.24 |