소프트웨어 개발 및 설계/아키텍처 패턴

[소프트웨어 설계] 디자인 패턴 완벽 정리: 싱글톤, 팩토리, 전략 패턴의 개념과 사용 사례

CodeCaine Explorer 2024. 10. 30. 19:12
728x90
반응형
SMALL

1. 싱글톤 패턴 (Singleton Pattern)

정의: 프로그램 전체에서 단 하나의 인스턴스만 존재하도록 보장하는 패턴입니다. 예를 들어, 앱에서 설정 값을 관리하는 클래스는 하나만 있어야 효율적입니다.

사용 사례:

  • 데이터베이스 연결 객체: 하나의 DB 인스턴스를 여러 곳에서 공유하여 리소스를 절약하기 위해 사용합니다.
  • 설정 관리 클래스: 애플리케이션의 설정을 관리하는 클래스는 하나만 있으면 충분하므로 싱글톤으로 만듭니다.

코드 예시:

class Singleton {
    // 정적 변수로 유일한 인스턴스를 저장
    private static Singleton instance;

    // 생성자를 private으로 설정하여 외부에서 인스턴스를 생성할 수 없게 함
    private Singleton() {}

    // 인스턴스를 반환하는 메서드
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

여기서 getInstance() 메서드를 통해서만 인스턴스를 가져올 수 있으며, 이 메서드는 처음 호출될 때 한 번만 인스턴스를 생성합니다. 이후 호출 때는 기존 인스턴스를 반환하여 하나의 인스턴스만 사용하도록 합니다.


2. 팩토리 패턴 (Factory Pattern)

정의: 객체 생성 코드를 별도의 팩토리 클래스에 숨겨서, 객체를 사용하는 쪽에서 직접 객체를 생성하지 않고 팩토리 클래스를 통해 생성하도록 하는 패턴입니다. 쉽게 말해, 객체 생성 과정을 "공장(Factory)"으로 분리하는 것입니다.

사용 사례:

  • 다양한 형태의 객체 생성이 필요할 때(예: 자동차 공장에서 다양한 차종을 만드는 것처럼).
  • 객체를 생성할 때 복잡한 로직이 필요할 때, 이를 팩토리 클래스에서 처리하여 코드의 가독성과 유지보수성을 높입니다.

코드 예시:

// Product 인터페이스
interface Product {
    void use();
}

// 구체적인 Product 클래스들
class ProductA implements Product {
    public void use() {
        System.out.println("Using Product A");
    }
}

class ProductB implements Product {
    public void use() {
        System.out.println("Using Product B");
    }
}

// 팩토리 클래스
class ProductFactory {
    public static Product createProduct(String type) {
        if (type.equals("A")) {
            return new ProductA();
        } else if (type.equals("B")) {
            return new ProductB();
        }
        return null;
    }
}

// 사용 예
public class Main {
    public static void main(String[] args) {
        Product product = ProductFactory.createProduct("A");
        product.use(); // 출력: Using Product A
    }
}

ProductFactory 클래스는 요청에 따라 ProductAProductB 객체를 반환합니다. 클라이언트는 직접 객체를 생성하지 않고 createProduct() 메서드를 호출하여 필요한 객체를 받아 사용할 수 있습니다.


3. 전략 패턴 (Strategy Pattern)

정의: 실행 중에 알고리즘(방법)을 선택할 수 있도록 하는 패턴입니다. 즉, 동일한 문제를 해결할 때 다른 방식(전략)을 적용할 수 있게 합니다.

사용 사례:

  • 다양한 알고리즘을 상황에 맞게 적용할 필요가 있을 때(예: 정렬 알고리즘을 상황에 따라 다르게 선택).
  • 조건에 따라 행위가 달라져야 할 때, 전략 패턴을 통해 행위를 선택할 수 있습니다.

코드 예시:

// 전략 인터페이스
interface Strategy {
    int execute(int a, int b);
}

// 덧셈 전략
class AdditionStrategy implements Strategy {
    public int execute(int a, int b) {
        return a + b;
    }
}

// 곱셈 전략
class MultiplicationStrategy implements Strategy {
    public int execute(int a, int b) {
        return a * b;
    }
}

// 컨텍스트 클래스 (전략을 사용하는 클래스)
class Calculator {
    private Strategy strategy;

    public Calculator(Strategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public int calculate(int a, int b) {
        return strategy.execute(a, b);
    }
}

// 사용 예
public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator(new AdditionStrategy());
        System.out.println("Addition: " + calculator.calculate(5, 3)); // 출력: Addition: 8

        calculator.setStrategy(new MultiplicationStrategy());
        System.out.println("Multiplication: " + calculator.calculate(5, 3)); // 출력: Multiplication: 15
    }
}

Calculator 클래스는 Strategy 인터페이스를 통해 다양한 전략을 선택할 수 있습니다. 예를 들어, 덧셈이나 곱셈 전략을 실행 중에 동적으로 바꿀 수 있어 코드의 유연성을 높입니다.


간단 정리

  1. 싱글톤 패턴: 전체 프로그램에서 단 하나의 인스턴스만 필요한 경우.
  2. 팩토리 패턴: 객체 생성 코드를 공장 클래스에 위임하여 생성과 사용을 분리.
  3. 전략 패턴: 실행 중에 다른 알고리즘(전략)을 선택하여 코드의 유연성을 높임.

이러한 디자인 패턴은 프로그램을 효율적이고 유연하게 설계하는 데 큰 도움을 줍니다.

728x90
반응형
SMALL