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
클래스는 요청에 따라 ProductA
나 ProductB
객체를 반환합니다. 클라이언트는 직접 객체를 생성하지 않고 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
인터페이스를 통해 다양한 전략을 선택할 수 있습니다. 예를 들어, 덧셈이나 곱셈 전략을 실행 중에 동적으로 바꿀 수 있어 코드의 유연성을 높입니다.
간단 정리
- 싱글톤 패턴: 전체 프로그램에서 단 하나의 인스턴스만 필요한 경우.
- 팩토리 패턴: 객체 생성 코드를 공장 클래스에 위임하여 생성과 사용을 분리.
- 전략 패턴: 실행 중에 다른 알고리즘(전략)을 선택하여 코드의 유연성을 높임.
이러한 디자인 패턴은 프로그램을 효율적이고 유연하게 설계하는 데 큰 도움을 줍니다.
728x90
반응형
SMALL