Head First Design Pattern(9)
-
13. Bridge Pattern
문제 TV를 작동시키는 리모컨은 여러 제조사가 있다. 그래서 TV를 모든 리모컨으로 동작시키기 위해서는 리모컨을 인터페이스화 하고 TV를 컴포지션하여 사용할 수 있었다. 그런데 이젠 TV 제조사가 많아졌다. 기존에는 삼성이 모든 TV를 만들었지만 이젠 LG도 TV를 생산한다고 한다. 이를 어떻게 풀어야 할까? 해결 방안 이 문제를 해결하는 방법은 간단하다. 리모컨에서 한 것처럼 TV도 인터페이스화하고 리모컨에서는 TV 인터페이스를 컴포지션하면 된다. 클래스 다이어그램으로 나타내면 다음과 같다. 그리고 RemoteControl과 TV의 관계를 브릿지 관계라고 한다. Java 코드로 구현하면 다음과 같다. public class Client { public static void main(String[] ar..
2021.11.14 -
12. State Pattern
문제 한 뽑기 기계가 있다. 이 뽑기 기계는 다음 상태 다이어그램으로 동작한다. 이 다이어그램을 바탕으로 뽑기 기계를 코드로 구현해보자. 먼저 상태를 살펴보자. 동전이 없는 상태, 있는 상태, 캡슐이 판매된 상태, 매진된 상태가 있다. 이를 클래스 변수로 만들면 다음과 같다. final static int SOLD_OUT = 0; // 캡슐매진 final static int NO_QUARTER = 1; // 동전없음 final static int HAS_QUARTER = 2; // 동전있음 final static int SOLD = 3; // 캡슐판매 int state = SOLD; // 현재 상태를 저장하기 위한 변수 동전이 투입, 반환되고 있는 상태에서 손잡이를 돌리면 캡슐이 나간다. // 동전을 투..
2021.10.15 -
11. Composite Pattern
문제 이터레이터 패턴에서 사용한 예시를 다시 써보자. 두 가게를 합병한 후로 장사가 탄탄대로를 달려서 이젠 점심 메뉴에 디저트 메뉴도 넣자는 기획이 들어왔다. 즉 점심 메뉴 안에 디저트 메뉴가 포함되는 것이다. 이러한 구조는 어떤 자료구조를 사용해야 할까? 메뉴 안에 메뉴... 트리 구조가 적당할 것 같다. 그림을 그려보면 대충 다음과 같다. 기존의 이터레이터 패턴을 유지하면서 모든 메뉴를 순회하도록 변경할 수 있을까? 정답부터 말하자면 그렇다. 컴포지트 패턴을 적용하면 이를 해결할 수 있다. 컴포지트 패턴 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층 구조로 만드는 패턴이다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다. 이..
2021.10.15 -
10. Iterator Pattern
문제 우리는 프로그래밍을 하면서 여러 자료구조를 사용한다. 간단하게는 배열부터 연결 리스트, 힙, 트리도 사용하기도 한다. 그런데 이런 자료구조에 저장한 데이터를 모두 접근하고 싶다면 어떻게 할까? 모든 자료구조마다 for 문을 돌리면서 탐색해야 할까? 또 자료구조마다 탐색 방법도 다른데 어떻게 해야 될까? 이러한 문제를 이터레이터 패턴으로 해결할 수 있다. 우리는 팬케이크 가게를 운영한다. 우리는 ArrayList를 사용해서 메뉴를 관리한다. 그런데 사업이 잘 되어 다른 가게와 합병하게 되었다. 그런데 이 가게는 배열로 메뉴를 관리하고 있었다. 그래서 기존에 우리가 메뉴를 접근할 때 사용하던 방식과 달라 혼란이 발생했다. public class MenuItem { String name; String d..
2021.10.15 -
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