Singleton Pattern(싱글톤 패턴)
Singleton Pattern은 오직 단 하나만의 인스턴스를 만들고 그것을 계속해서 재사용하는 원칙을 의미한다.
따라서 Singleton Pattern을 적용하면 의미상 한 클래스에 두 개의 객체가 존재할 수 없는 것을 의미한다.
Singleton Pattern을 적용하려면 아래와 같은 3가지 조건이 필요하다.
- new연산을 실행할 수 없도록 생성자에 private접근 제어자를 지정함
- 유일한 단일 객체를 반환할 수 있는 정적 메소드가 필요함
- 유일한 단일 객체를 참조할 정적 참조 변수가 필요함
위의 코드를 살펴보면 Singleton클래스의 참조변수를 정적변수로 선언을 하고 초기화를 하지 않았다.
그런 다음 기본생성자를 선언했는데 public이 아닌 private로 선언을 하였다.
그런다음 반환형이 Singleton인 getInstance()메소드를 이용하여 만약 객체 참조 변수인 singleton이 null이면
new연산자를 통해 객체를 생성해주고 객체가 생성되어 있다면 기존에 있던 객체 참조 변수 주소 값을 return해준다.
main()메소드에서 Singleton 참조변수를 만들어 출력을 하게 되면 다 같은 값을 아래처럼 출력하게 된다.
여기서 중요한 점은 단일객체인 경우에는 공유객체로 사용되기 때문에 속성을 가지면 안된다.
왜냐면 단일 객체의 속성이 다른 참조 변수에 영향을 미칠수도 있기 때문이다.
Singleton Pattern의 장점은 단일객체를 이용해 다 공유하기 때문에 메모리 낭비를 방지해준다는 점이 있다.
반대로 단점은 SOLID원칙 중 OCP원칙에 위배 될 가능성이 있다.
Template Method Pattern(템플릿 메서드 패턴)
상위 클래스에 공통 로직을 수행하는 템플릿 메소드와 하위클래스에 오버라이딩을 강제하는 추상메소드 또는
선택적으로 하위클래스가 오버라이딩 할 수 있는 훅(Hook)메소드를 두는 패턴을 의미
DIP(역전 의존 원칙)을 활용하는 패턴
위의 코드를 보면 학생과 선생님이 활동하는 것을 active()메소드에 적어놨는데
자세히 보면 수업을 받느냐 가르치냐 말고는 다른 부분은 다 공통적인 활동인 것을 볼 수 있다.
그럼 아래처럼 분리를 하면 어떨까?
Person이라는 클래스에 학생과 선생님이 공통으로 하는 행동을 active()메소드에 넣고 추상메소드와 훅메소드를 넣었다.
이렇게 하면 Student클래스에서는 추상메소드인 teach()를 무조건 구현해야하므로 학생이 수업을 받는다 라고 구현을
하면 되고 똑같이 Teacher클래스에서도 선생님 역할에 맡게 수정하면 된다.
Template Method Pattern을 한마디로 정리하면...
상위클래스의 견본 메소드에서 하위클래스가 오버라이딩함 메소드를 호출하는 패턴을 의미한다.
Strategy Pattern(전략 패턴)
Strategy Pattrern를 구성하는 3가지 요소가 있다.
- 전략 메소드를 가진 전략 객체
- 전략 객체를 사용하는 컨텍스트
- 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트
이렇게 총 3가지로 구성된다.
예를 들어서 중고차 판매를 하는 상황을 가정해보자.
그럼 여기서 중고차는 전략객체가 되고, 중고차를 이용하는 고객이 컨텍스트가 되고, 구매자에게 중고차를 판매하는
판매자가 클라이언트가 된다.
위의 코드를 살펴보면 Dealer인터페이스는 클라이언트를 의미하는 딜러이다.
여기서 다양한 차량을 판매하는 딜러를 공통적으로 나타내기 위해 인터페이스로 구현을 하였다.
Buyer클래스는 구매자 즉, 컨텍스트를 의미하고, 다양한 차량의 종류들은 전략객체를 의미한다.
위의 main()메소드에서는 Dealer인터페이스 객체를 생성만 하고 초기화를 하지 않았다.
왜냐면 딜러가 여러 종류의 차량을 판매하기 때문에 그때 그때 판매하는 차량의 종류로 객체를 초기화 하고 있다.
이런식으로 Strategy Pattern은 전략을 다양하게 변경하면서 컨텍스트를 실행할 수 있다.
Strategy Pattern을 자세히 보면 비슷한 디자인 패턴이 존재한다.
바로 Template Method Pattern이다.
둘은 같은 문제를 다른 방식으로 해결하는 디자인 패턴인데
Template Method Pattern은 상속을 이용하는 패턴이고, Strategy Pattern은 자바가 상속을 한번 밖에 하지 못한다는 단점을
보완한 패턴이다.
즉, Strategy Pattern 또한 OCP, DIP원칙을 지킨다.
Strategy Pattern을 한마디로 정의하면 클라이언트의 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴이다.
'JAVA-SOLID' 카테고리의 다른 글
[OOP] 스프링 삼각형(AOP) (0) | 2023.06.21 |
---|---|
[OOP] 스프링 삼각형(IoC/DI) (0) | 2023.06.18 |
[OOP] 디자인 패턴(Adapter, Proxy, Decorator Pattern) (0) | 2023.06.08 |
[OOP] 객체지향설계 5원칙_SOLID원칙 (0) | 2023.06.08 |
[OOP] 자바 vs 구조적/절차적 프로그래밍 (0) | 2023.05.30 |