팩토리 패턴의 개념

팩토리 패턴은 객체를 생성하는 인터페이스를 정의하고, 이를 통해 객체의 생성을 캡슐화하는 패턴입니다

즉, 어떤 클래스의 인스턴스를 만들지에 대한 결정을 서브클래스에 위임하는 것입니다

이는 객체의 생성과 사용을 분리함으로써 코드의 유연성을 향상시킵니다

 

구성 요소

1. 제품 인터페이스 (Product Interface)

팩토리 패턴에서 생성될 객체들의 공통 인터페이스를 정의합니다

이 인터페이스를 통해 클라이언트 코드는 구체적인 제품의 클래스를 알 필요 없이 해당 제품을 사용할 수 있습니다

 

2. 제품 클래스 (Product Class)

팩토리 패턴에서 생성될 구체적인 제품 클래스들을 구현합니다

이 클래스들은 공통된 제품 인터페이스를 따라야 합니다

 

3. 팩토리 인터페이스 (Factory Interface)

객체 생성을 위한 인터페이스를 정의합니다

이 인터페이스에는 객체를 생성하는 메서드가 선언되어 있습니다

 

4. 팩토리 클래스 (Factory Class)

객체의 생성을 책임지는 클래스로, 팩토리 인터페이스를 구현합니다

이 클래스에서는 어떤 구체적인 제품 클래스의 인스턴스를 생성할지를 결정합니다

 

팩토리 패턴의 장점

1. 객체 생성의 캡슐화

클라이언트 코드는 객체의 생성 방식을 알 필요가 없으며, 단지 팩토리 인터페이스를 통해 객체를 생성할 수 있습니다

이로써 객체 생성의 세부사항이 숨겨지고 유지보수가 용이해집니다

 

2. 클라이언트 코드의 단순화

클라이언트 코드에서는 구체적인 제품 클래스를 직접 참조하지 않고, 팩토리 인터페이스를 통해 객체를 생성하므로 코드가 단순해집니다

 

3. 확장성과 유연성

새로운 제품 클래스를 추가하거나 기존 클래스를 변경하지 않고도 팩토리 클래스를 확장하여 새로운 객체를 생성할 수 있습니다

 

// 제품 인터페이스
interface Product {
    void doSomething();
}

// 제품 클래스 1
class ConcreteProduct1 implements Product {
    public void doSomething() {
        System.out.println("Product 1 is doing something.");
    }
}

// 제품 클래스 2
class ConcreteProduct2 implements Product {
    public void doSomething() {
        System.out.println("Product 2 is doing something.");
    }
}

// 팩토리 인터페이스
interface Factory {
    Product createProduct();
}

// 팩토리 클래스 1
class ConcreteFactory1 implements Factory {
    public Product createProduct() {
        return new ConcreteProduct1();
    }
}

// 팩토리 클래스 2
class ConcreteFactory2 implements Factory {
    public Product createProduct() {
        return new ConcreteProduct2();
    }
}

// 클라이언트 코드
public class Client {
    public static void main(String[] args) {
        Factory factory1 = new ConcreteFactory1();
        Product product1 = factory1.createProduct();
        product1.doSomething();

        Factory factory2 = new ConcreteFactory2();
        Product product2 = factory2.createProduct();
        product2.doSomething();
    }
}

+ Recent posts