[java] 자바 디자인 패턴(Design patterns in Java)

디자인 패턴은 소프트웨어 개발에서 자주 발생하는 문제를 해결하고, 유지보수 가능하고 확장 가능한 코드를 작성하는 방법을 제공합니다. 이는 개발자들 간의 공통된 언어와 개발 방법을 가지고 작업할 수 있게 해줍니다. 이 글에서는 자바 언어로 구현된 몇 가지 디자인 패턴에 대해 안내하겠습니다.

1. 싱글톤 패턴 (Singleton pattern)

싱글톤 패턴은 애플리케이션 전체에서 단일 인스턴스를 유지하고 접근하는 패턴입니다. 이 패턴을 사용하면 여러 개의 인스턴스가 생성되지 않고 오직 한 개의 인스턴스만 사용되게 됩니다.

public class Singleton {
    private static Singleton instance;
  
    private Singleton() {
        // private 생성자
    }
  
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

2. 전략 패턴 (Strategy pattern)

전략 패턴은 다양한 알고리즘을 객체화하여 동적으로 교체할 수 있는 패턴입니다. 이 패턴을 사용하면 알고리즘을 별도의 클래스로 분리하여, 실행 중에 알고리즘을 변경할 수 있습니다.

public interface Strategy {
    void execute();
}

public class StrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("전략 A 실행");
    }
}

public class StrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("전략 B 실행");
    }
}

public class Context {
    private Strategy strategy;
  
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
  
    public void executeStrategy() {
        strategy.execute();
    }
}

3. 팩토리 메서드 패턴 (Factory method pattern)

팩토리 메서드 패턴은 객체 생성을 서브 클래스에 위임하여 객체를 생성하는 패턴입니다. 이 패턴을 사용하면 객체 생성을 추상화하여 서브 클래스에서 구체적인 객체 생성을 담당합니다.

public abstract class Product {
    public abstract void use();
}

public class ConcreteProductA extends Product {
    @Override
    public void use() {
        System.out.println("Product A 사용");
    }
}

public class ConcreteProductB extends Product {
    @Override
    public void use() {
        System.out.println("Product B 사용");
    }
}

public abstract class Creator {
    public void someOperation() {
        Product product = createProduct();
        product.use();
    }
  
    protected abstract Product createProduct();
}

public class ConcreteCreatorA extends Creator {
    @Override
    protected Product createProduct() {
        return new ConcreteProductA();
    }
}

public class ConcreteCreatorB extends Creator {
    @Override
    protected Product createProduct() {
        return new ConcreteProductB();
    }
}

결론

디자인 패턴은 소프트웨어 개발에서 자주 발생하는 문제를 해결하는 데 도움을 주는 중요한 도구입니다. 자바 언어로 구현된 몇 가지 디자인 패턴에 대해 살펴보았습니다. 이러한 패턴을 잘 활용하면 좀 더 유지보수 가능하고 확장 가능한 코드를 작성할 수 있습니다. 디자인 패턴에 대한 이해는 개발자들 간의 공통된 언어와 개발 방법을 형성하는 데 도움이 될 것입니다.

참고 자료