본문 바로가기
컴퓨터 과학/디자인패턴

[디자인패턴] 생성 패턴(1) : 심플 팩토리(Simple Factory)

by webcodur 2024. 3. 24.
728x90
반응형

목차

     

    심플 팩토리(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());
        }
    }

     

     

    패턴 미적용 시 문제점

    패턴을 적용하지 않을 경우, 클라이언트 코드는 구체적인 상품 클래스에 직접 의존하게 된다. 이는 다음과 같은 문제점을 야기한다:

    1. 유연성 부족: 새로운 상품타입을 추가하거나 기존 상품 타입을 수정할 때마다 클라이언트 코드도 함께 변경해야 한다. 이는 OCP(Open-Closed Principle, 개방-폐쇄 원칙)를 위반하며, 시스템의 유연성과 확장성을 저하시킨다.
    2. 코드 중복: 상품 객체를 생성하는 로직이 시스템의 여러 곳에서 중복될 수 있다. 만약 생성 로직이 복잡하다면, 이러한 중복은 유지보수의 부담을 증가시킨다.
    3. 객체 생성의 복잡성 증가: 클라이언트가 직접 객체를 생성할 경우, 생성 과정에 필요한 모든 세부 정보를 알고 있어야 한다. 이는 객체 생성의 복잡성을 클라이언트에게 전가시키는 결과를 초래한다.

    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 패턴의 핵심은 "생성에 관련된 코드를 한 곳에 집중시킴으로써, 코드의 중복을 줄이고, 유지보수를 용이하게 하며, 시스템의 유연성과 확장성을 향상시키는 것"이다. 이를 통해 클라이언트 코드는 필요한 객체를 쉽고 간단하게 생성할 수 있으멀로, 전반적인 소프트웨어 설계의 품질이 향상된다.

     

    반응형