[java] 자바 디자인 패턴

자바 디자인 패턴은 소프트웨어 설계에서 일반적인 문제를 해결하기 위해 사용되는 bew모 프로그래밍 템플릿입니다. 디자인 패턴은 소프트웨어 아키텍처의 재사용 가능한 해결책이며, 시스템의 유연성과 확장성을 향상시키는 데 도움을 줍니다.

디자인 패턴의 유형

  1. 생성 패턴(Creational Patterns): 객체의 생성을 처리하는 패턴으로, 인스턴스화를 추상화하거나, 클래스간의 종속성을 줄여줍니다. 대표적인 예로는 팩토리 메소드 패턴, 추상 팩토리 패턴, 싱글톤 패턴 등이 있습니다.

  2. 구조 패턴(Structural Patterns): 클래스와 객체들을 조합하여 더 큰 구조를 형성하는 패턴입니다. 구조 패턴은 시스템의 구성요소들 간의 관계를 보다 효율적으로 조정하는 데 사용됩니다. 대표적인 예로는 어댑터 패턴, 데코레이터 패턴, 컴포지트 패턴, 프록시 패턴 등이 있습니다.

  3. 행위 패턴(Behavioral Patterns): 객체 간의 상호작용과 역할에 관련된 패턴입니다. 행위 패턴은 시스템의 동작 방식 및 알고리즘을 구현하고 변경하는 데 사용됩니다. 대표적인 예로는 전략 패턴, 옵저버 패턴, 템플릿 메소드 패턴, 커맨드 패턴 등이 있습니다.

자바 디자인 패턴 예제

  1. 팩토리 메소드 패턴(Factory Method Pattern): 객체를 생성하는 인터페이스를 정의하고 서브클래스에서 어떤 클래스의 인스턴스를 생성할지를 결정하는 패턴입니다. 이를 통해 객체를 생성하는 코드와 실제 객체의 구현 코드를 분리할 수 있습니다.
public interface Car {
    void drive();
}

public class Sedan implements Car {
    @Override
    public void drive() {
        System.out.println("Sedan is driving.");
    }
}

public class Suv implements Car {
    @Override
    public void drive() {
        System.out.println("SUV is driving.");
    }
}

public abstract class CarFactory {
    public abstract Car createCar();

    public void testDrive() {
        Car car = createCar();
        car.drive();
    }
}

public class SedanFactory extends CarFactory {
    @Override
    public Car createCar() {
        return new Sedan();
    }
}

public class SuvFactory extends CarFactory {
    @Override
    public Car createCar() {
        return new Suv();
    }
}

public class Main {
    public static void main(String[] args) {
        CarFactory sedanFactory = new SedanFactory();
        Car sedan = sedanFactory.createCar();
        sedan.drive();  // "Sedan is driving."

        CarFactory suvFactory = new SuvFactory();
        Car suv = suvFactory.createCar();
        suv.drive();  // "SUV is driving."
    }
}
  1. 싱글톤 패턴(Singleton Pattern): 애플리케이션 전역에서 인스턴스가 단 하나만 존재하도록 보장하는 패턴입니다. 이를 통해 하나의 인스턴스를 여러 번 생성하지 않고 공유하여 메모리를 절약할 수 있습니다.
public class Singleton {
    private static Singleton instance;

    private Singleton() {}  // private constructor

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

public class Main {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();

        System.out.println(singleton1 == singleton2);  // true
    }
}

위의 예제 코드를 통해 생성 패턴의 팩토리 메소드 패턴과 구조 패턴의 싱글톤 패턴을 살펴보았습니다. 이 외에도 다양한 디자인 패턴이 존재하며, 각 패턴은 특정한 상황에 적합하게 설계되었습니다.

결론

자바 디자인 패턴은 소프트웨어 공학에서 효율적이고 유지보수 가능한 소프트웨어 설계를 위한 매우 유용한 도구입니다. 디자인 패턴을 이해하고 적절하게 활용하면 코드의 유연성과 확장성을 향상시킬 수 있습니다. 다양한 디자인 패턴을 학습하고 실제 개발 프로젝트에 적용해보세요!

참고 자료