Computer Sciences/Design Patterns(19)
-
7. Adapter Pattern
문제 어댑터는 우리 주위에서 흔하게 볼수 있는 것이다. 110V를 220V로 변환해야 하는 경우가 대표적이다. 우리나라는 220V를 쓰는데 유럽 같은 경우 110V를 쓴다. 그래서 우리가 만약 외국 여행을 가는데 충전기를 사용하려면 어댑터를 갖고 가서 110V를 220V로 바꿔줘야 한다. 프로그래밍에서도 이런 경우가 발생한다. 우리가 운영하던 시스템이 있는데 외부 업체에서 인터페이스를 제공해주었다. 그런데 우리 시스템과 연결이 되지 않는 경우 어떻게 해야 할까? 여기서 어댑터를 사용할 수 있다. 오리와 칠면조 우리는 오리와 칠면조 객체를 가지고 있다. public class MallardDuck implements Duck { @Override public void quack() { System.out...
2021.10.14 -
6. Command Pattern
문제 지수는 친구로부터 특별한 선물을 받았다. 그건 리모컨인데 내가 명령을 입력하면 이를 동작 시켜주는 특별한 리모컨이다. 그래서 집에서 사용하는 여러 가전제품을 사용하려고 명령을 등록하려고 하는데 문제가 생겼다. 각각의 가전제품에서 명령을 실행하는 방법이 달랐던 것이다. 전등은 켜고 끌 때 on(), off()로 수행되고 선풍기는 high(), medium(), low(), off()와 같이 단계 별로 바람 세기를 조절할 수 있게 되어있다. 그 외에 TV, 냉장고 등 많은 가전제품이 서로 다르게 구현되어 있다. 이 문제를 어떻게 해결해야 할까? 해결 방안 여러 객체의 행위를 통일하고 싶을 때 우리는 인터페이스를 사용했다. 이번에도 인터페이스를 만들어야 겠다. 그렇다면 어떻게 만들까? 일단 리모컨에서는 ..
2021.10.14 -
5. Singleton Pattern
싱글톤 패턴 해당 클래스의 인스턴스를 단 하나만 만들고 해당 인스턴스를 필요로 하는 객체들이 공유하여 사용하도록 하는 패턴이다. public class SingletonObj { // static 멤버로 해당 클래스를 만들어놓았다. private static SingletonObj singletonObj; // other fields... // 생성자를 private으로 만들어 인스턴스를 생성하지 못하게 막았다. private SingletonObj() {} // 이 메서드를 통해 이 클래스의 인스턴스에 접근하도록 한다. public static SingletonObj getInstance() { if (singletonObj == null) { singletonObj = new SingletonObj(..
2021.09.15 -
4. Abstract Factory Method
문제 프랜차이즈를 운영하는 피자 가게가 있다. 그동안 본점에서는 분점에 지침을 내려주지 않았다. 그래서 각 분점에서는 마음대로 더 싼 원재료를 사용해서 품질이 떨어지는 피자를 만들어서 팔았다. 이는 브랜드에 타격이 올 수도 있기 때문에 조치를 취해야 한다. 원재료 품질 관리 방법 서울 피자 메뉴 치즈 피자 - 토마토 소스, 모짜렐라 치즈, 파마산 치즈 야채 피자 - 토마토 소스, 모짜렐라 치즈, 파마산 치즈, 시금치, 올리브 조개 피자 - 토마토 소스, 모짜렐라 치즈, 파마산 치즈, 조개 페퍼로니 피자 - 토마토 소스, 모짜렐라 치즈, 파마산 치즈, 시금치, 올리브, 페퍼로니 부산 피자 메뉴 치즈 피자 - 마리나라 소스, 레지아노 치즈, 마늘 야채 피자 - 미라나라 소스, 레지아노 치즈, 버섯, 양파, ..
2021.09.15 -
3. Factory & Factory Method Pattern
문제 우리 동네에는 피자집이 하나 있다. 이 피자집에서는 예전부터 한 가지 피자만 만들어서 팔았다. 그러나 손님들이 다른 메뉴도 만들어달라는 요청이 들어왔고 이에 따라 신메뉴를 만들어서 제공했다. // 기존 방식 public class PizzaStore { Pizza orderPizza() { Pizza pizza = new Pizza(); pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; } } // 새로운 방식 public class PizzaStore { Pizza orderPizza(String type) { Pizza pizza; // 피자 타입에 따라 인스턴스 생성 if (type.equals("cheese")) {..
2021.09.15 -
2. Decorator Pattern
문제 커피 주문 시스템에서 각 커피에 대한 첨가물이 추가해달라는 요구사항이 들어왔다. 이를 해결해보자. 상속 위처럼 상속을 이용해서 설계를 하면 첨가물과 커피가 늘어날 때마다 클래스를 만들어서 상속해야 한다. 이는 엄청난 복잡도를 유발하게 될 것이다. 인스턴스 변수와 슈퍼 클래스 상속 이렇게 하면 어떨까? 이 역시 문제가 많다. 첨가물 가격이 바뀔 때마다 기존 코드를 수정해야 한다. 첨가물 종류가 늘어날 경우 그에 따른 메서드를 추가해야 한다(ex.시럽). 첨가물이 들어가지 않는 음료의 경우에도 불필요한 메서드를 상속받는다(ex.아이스티). 중복된 첨가물에 대한 표현이 불가능하다(ex.더블 모카). 해결 방법 객체에 추가적인 조건을 동적으로 추가해야 하는 문제는 데코레이터 패턴을 통해 해결할 수 있다. ..
2021.09.06