이때 인스턴스가 1개만 생성되는 특징인 '싱글톤 패턴'을 이용시 하나의 인스턴스를 메모리에 등록해서 여러 쓰레드가 동시에 해당 인스턴스를 공유하여 사용할 수 있게끔 할 수 있기 때문에
=> 요청이 많은 곳에서 사용하면 효율을 높일 수 있다.
🤔but 주의: 동시성 문제를 고려해서 설계해야 된다.
이런 장점을 통해 DBCP(DataBaseCommection Pool)이라는 공통된 객체를 여러개 생성해서 사용해야 하는 상황에서 주로 쓰인다.
싱글톤 인스턴스가 너무 많은 일을 하거나 혹은 많은 데이터를 공유할 경우 다른 클래스의 인스턴트들 간의 결합도가 높아져 "개방-폐쇄 원칙"을 위배 하게 된다.
=> 이로인해 수정이 어려워지고 유지보수 비용이 높아질 수 있다.
- 멀티쓰레드 환경에서 동기화 처리를 하지 않을 경우 인스턴스가 2개가 생성될 수도 있다.
=> 꼭 필요한 경우에만 사용하자 그렇기 때문에 그렇지 않은 곳에서는 지양하자
자신을 멤버로 선언해서 메모리에 올려놓는다. (static)
외부에서 멤버로 선언된 car를 가져올 수 있는 메소드를 만들어 getInstance 메서드 외에는 CarClass 객체를 생성 하거나 사용할 수 없게 된다.
-> 해당 차 객체를 누군가 이용한다면 이용을 못한다.(싱글톤 패턴의 예시)
특정한 기능을 수행하는데에 있어 다양한 알고리즘이 적용될 수 있는 경우, 이 다양한 알고리즘을 별도로 분리하는 설계 방법을 의미
한 과일 매장은 상황에 따라 다른 가격 할인 정책을 적용하고 있다. 제일 먼저 온 손님에게 10%를 할인해주고 마지막 손님은 20% 그리고 신선도가 떨어진 과일에 대해서는 20% 할인을 해주고 있다.
이렇게 되면 할인조건에 따라서 if-else로 조건 및 분기를 달게 될 것이다... 그렇게 되면 아래와 같은 문제점이 발생할 수 있다.
public interface DiscountPolicy {
double calculateWithDisCountRate(Item item);
}
public class FirstCustomerDiscount implements DiscountPolicy{
@Override
public double calculateWithDisCountRate(Item item) {
return item.getPrice() * 0.9;
}
}
public class LastCustomerDiscount implements DiscountPolicy{
@Override
public double calculateWithDisCountRate(Item item) {
return item.getPrice() * 0.8;
}
}
public class UnFreshFruitDiscount implements DiscountPolicy{
@Override
public double calculateWithDisCountRate(Item item) {
return item.getPrice() * 0.8;
}
}
private final DiscountPolicy discountPolicy;
public Calculator(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
public double calculate(List<Item> items) {
double sum = 0;
for (Item item : items) {
sum += discountPolicy.calculateWithDisCountRate(item);
}
return sum;
}
}
public class FruitController {
public static void main(String[] args) {
Calculator calculator = new Calculator(new FirstCustomerDiscount());
calculator.calculate(Arrays.asList(
new Item("Apple", 3000),
new Item("Banana", 3000),
new Item("Orange", 2000),
new Item("Pitch", 4000)
));
}
}
일반적으로 Controller는 사용자의 요청(클릭이나 입력) 등을 매핑하여 받아오기 때문에 특정 알고리즘(첫번째 손님 계산)을 눌렀다는 것을 알 수 있다. (전략패턴)
모든 상황에서 전략패턴이 사용되는 것은 유용하지 않다.
- 컨텍스트에 적용되는 알고리즘이 하나이거나 두개인 경우는 분기를 타는 것이 편한 경우도 존재한다.
-> 그러나 요구사항의 변경으로 변경될 여지가 있고 변화의 형태가 다양함이 어느정도 보장될 때 전략패턴을 고려해보시길 추천드립니다.
devmoony님의 글을 바탕으로 작성하였습니다.
hirlawldo님의 글을 바탕으로 작성하였습니다.
kyle님의 글을 바탕으로 작성하였습니다.