ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 생성패턴 - 팩토리 메소드(Factory Method) 패턴
    Java/디자인패턴 2024. 11. 12. 10:06
    반응형

    팩토리 메소드(Factory Method) 패턴은 **생성 패턴(Creational Pattern)**에 속하는 디자인 패턴입니다. 이 패턴은 객체의 생성 방식을 서브클래스에서 결정하도록 하여 객체 생성 시 객체의 구체적인 클래스를 지정하지 않고도 객체를 생성할 수 있게 해줍니다. 즉, 객체 생성을 캡슐화하여 생성 로직을 서브클래스에서 정의할 수 있도록 합니다.

    팩토리 메소드 패턴의 목적

    • 특정 클래스의 인스턴스를 생성하는 책임을 서브클래스에게 위임하여, 상위 클래스에서 객체를 생성하는 방법과 관련된 결정을 서브클래스에서 정의하도록 합니다.
    • 객체를 생성할 때 클라이언트 코드가 구체적인 클래스에 의존하지 않도록 하여, 코드의 유연성과 확장성을 높입니다.

    팩토리 메소드 패턴의 구조

    • Product (제품 인터페이스): 팩토리 메소드가 생성할 객체의 인터페이스 또는 추상 클래스.
    • ConcreteProduct (구체적인 제품): Product 인터페이스를 구현한 클래스들입니다. 팩토리 메소드를 통해 생성됩니다.
    • Creator (생성자): 팩토리 메소드를 선언하는 클래스입니다. 기본 팩토리 메소드를 정의할 수도 있고, 이를 서브클래스에서 오버라이드할 수 있도록 할 수도 있습니다.
    • ConcreteCreator (구체적인 생성자): Creator 클래스를 상속하여 실제 객체 생성 로직을 구현합니다.

    팩토리 메소드 패턴 예제 코드 (Java)

    이 예제에서는 Product라는 인터페이스와 ConcreteProductA와 ConcreteProductB라는 두 가지 제품을 정의하고, ProductFactory라는 팩토리 클래스를 통해 제품을 생성하는 방식을 보여줍니다.

    // Product 인터페이스
    interface Product {
        void use();
    }
    
    // ConcreteProductA 클래스
    class ConcreteProductA implements Product {
        @Override
        public void use() {
            System.out.println("Using Product A");
        }
    }
    
    // ConcreteProductB 클래스
    class ConcreteProductB implements Product {
        @Override
        public void use() {
            System.out.println("Using Product B");
        }
    }
    
    // Creator 클래스 (추상 클래스 또는 인터페이스)
    abstract class ProductFactory {
        // 팩토리 메소드
        abstract Product createProduct();
    
        // 제품을 사용하는 메소드
        public void useProduct() {
            Product product = createProduct(); // 제품 생성
            product.use(); // 제품 사용
        }
    }
    
    // ConcreteCreatorA 클래스
    class ProductFactoryA extends ProductFactory {
        @Override
        Product createProduct() {
            return new ConcreteProductA();
        }
    }
    
    // ConcreteCreatorB 클래스
    class ProductFactoryB extends ProductFactory {
        @Override
        Product createProduct() {
            return new ConcreteProductB();
        }
    }
    
    // 사용 예시
    public class Main {
        public static void main(String[] args) {
            ProductFactory factoryA = new ProductFactoryA();
            ProductFactory factoryB = new ProductFactoryB();
            
            factoryA.useProduct(); // "Using Product A" 출력
            factoryB.useProduct(); // "Using Product B" 출력
        }
    }

    코드 설명

    1. Product 인터페이스는 생성될 객체의 공통된 인터페이스 역할을 합니다.
    2. ConcreteProductAConcreteProductB는 Product 인터페이스를 구현한 실제 클래스들로, 각각 구체적인 기능을 제공합니다.
    3. ProductFactory는 팩토리 메소드를 정의하는 추상 클래스입니다. 팩토리 메소드(createProduct())는 구체적인 제품 생성을 위한 추상 메소드로, 서브클래스에서 오버라이드됩니다.
    4. ProductFactoryAProductFactoryB는 각각 ConcreteProductA와 ConcreteProductB를 생성하는 구체적인 팩토리 클래스들입니다.
    5. Main 클래스에서, 각 팩토리 클래스를 통해 필요한 제품을 생성하고 사용하는 것을 보여줍니다.

    팩토리 메소드 패턴의 장점

    • 클래스 간 결합도를 낮춤: 클라이언트가 구체적인 클래스에 의존하지 않고 인터페이스만을 사용하게 되어 결합도가 낮아집니다.
    • 확장 용이성: 새로운 제품 클래스가 필요하면 새로운 팩토리 클래스를 추가해 구현할 수 있습니다.
    • 유연성 증가: 객체 생성과 관련된 코드를 별도의 클래스에서 관리하므로 클라이언트는 생성 방식에 신경 쓸 필요가 없습니다.

    팩토리 메소드 패턴의 단점

    • 클래스 수 증가: 팩토리 메소드 패턴을 사용할 경우 팩토리 클래스와 제품 클래스가 별도로 필요하기 때문에 클래스 수가 많아질 수 있습니다.
    • 복잡성 증가: 작은 규모의 프로그램에서는 오히려 코드가 복잡해질 수 있습니다.

    팩토리 메소드 패턴은 주로 객체 생성 로직을 캡슐화하여 결합도를 낮추고 유연성을 높이는 데 사용됩니다.

    반응형

    댓글

Designed by Tistory.