Programming18 디자인패턴 시리즈 10. 플라이웨이트 패턴 (Flyweight Pattern) 플라이웨이트 패턴 (Flyweight Pattern) 특정한 클래스의 인스턴스 하나로 여러 개의 가상 인스턴스를 제공한다. 코드에 적용해보기 '꿈의 마을'과 같은 도시 건설 게임을 만든다고 하자. 간단하게 나무를 심는 로직을 설계한다고 할 때 이 나무들을 각각 x, y 좌표를 가지고 있다. Tree 인스턴스에는 나무의 상태가 저장이 되며, display() 메소드에 x, y 좌표, 나이 등을 바탕으로 화면에 나무를 그린다. 각각의 속성을 그리는데 필요한 데이터가 x: 4byte, y:4byte라고 했을 때 하나의 나무를 그리면 최소 8byte이상을 차지한다. 이를 수백, 수천개 그린다면 어떨까, 나무를 그리면 그릴 수록 데이터를 많이 차지한다. 메모리는 한정적인 자원이기 때문에 수억개의 나무를 그리면 더.. 2023. 1. 24. 디자인패턴 시리즈 9. 브리지 패턴 (Bridge Pattern) 브리지 패턴 (Bridge Pattern) 기능을 처리하는 클래스와 구현을 담당하는 추상 클래스를 구별한다. 구현과 더불어 추상화 부분까지 변경해야 한다면 사용하면 좋을 패턴이다. 코드에 적용해보기 만능 리모컨을 만들기로 해보자. 리모컨의 기능은 똑같은 추상화 부분을 바탕으로 하지만 TV의 모델마다 많은 구현 코드를 사용해야 하므로 객체 지향적으로 설계해야 한다. RemoteControl 인터페이스 또는 추상 클래스를 만들고 제조사마다 이를 상속 받는 구현 클래스를 만들었다. 사용자 인터페이스는 이미 추상화 했으므로 리모컨 사용자가 쓸 다양한 TV 종류에 따라 구상 클래스를 바꿔 쓸 수 있다. 하지만 사용자들이 제공하는 정보에 맞춰서 리모컨을 수정하다 보면 추상화 부분도 바꿔야 할 일이 생긴다. 구체적인.. 2023. 1. 24. 디자인패턴 시리즈 8. 상태 패턴 (State Pattern) 상태 패턴 (State Pattern) 내부 상태가 바뀜에 따라 객체의 행동이 바뀔 있도록 한다. 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다. 코드에 적용해보기 어릴 때 한번쯤은 동전을 넣고 레버를 돌려 장난감이나 간식을 뽑는 뽑기 기계를 해봤을 것이다. 뽑기를 하는 일련의 행동들을 다이어그램으로 표시하면 그림과 같다. 동그라미 안에 있는 부분은 '상태'를 의미하고 화살표는 '상태 전환'을 나타낸다. 총 4개의 상태와 5개의 상태 전환이 있다. final static int SOLD_OUT = 0; // 상품 없음 final static int NO_COIN = 1; // 동전 없음 final static int HAS_COIN = 2; // 동전 있음 final static int SOLD.. 2023. 1. 23. 디자인패턴 시리즈 7. 빌더 패턴 (Builder Pattern) 빌더 패턴 (Builder Pattern) 제품을 여러 단계로 나눠서 만들도록 제품 생산 단계를 캡슐화한다. 프로그래밍 할 때 가장 많이 쓰이는 때는 복잡한 객체를 생성하는 순간이다. 특히 선택적인(Optional) 속성이 많을 때 유용하다. 코드에 적용해보기 피자에는 토핑이 다양하게 들어간다. 기호에 따라 선호하거나 빼고 싶은 토핑이 있을 수도 있다. 또한 피자를 만드는 데에는 여러 단계와 다양한 절차를 거치게 된다. 이러한 과정을 거치며 객체를 만드는데 언뜻 팩토리 패턴과 유사하게 보일 수도 있다. 하지만 팩토리 패턴은 한 단계에서 모든 것을 처리한다는 점에서 다르다. 빌더를 이용하여 고기를 좋아하는 사람들을 위한 피자와 비건 피자를 만들어보겠다. public class Pizza { String n.. 2023. 1. 19. 디자인패턴 시리즈 6. 템플릿 메소드 패턴 (Template Method Pattern) 템플릿 메소드 패턴 (Template Method Pattern) 알고리즘의 골격을 정의한다. 자세히 설명하면 알고리즘의 일부 단계를 서브 클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하되 특정 단계를 서브 클래스에서 재정의할 수 있다. 코드에 적용해보기 커피와 홍차를 만드는 방법은 아주 유사하다. 물을 끓이고, 커피를 우리고, 컵에 따르고, 기호에 따라 설탕 혹은 우유를 첨가한다. 홍차는 물을 끓이고, 찻잎을 우리고, 컵에 따르고, 레몬을 추가한다. 전략 패턴에서도 배웠던 원칙인 "달라지는 부분과 달라지지 않는 부분을 분리한다" 라는 원칙에 따라 분리해보자. 물을 끓이고, 컵에 따르는 과정은 완전히 동일한 행위이다. public class Coffee { void prepareRecipe.. 2023. 1. 17. 디자인패턴 시리즈 5. 커맨드 패턴 (Command Pattern) 커맨드 패턴 (Command Pattern) 요청 내용을 객체로 캡슐화해서 객체를 서로 다른 요청에 따라 매개변수화할 수 있다. 실행될 다양한 기능들을 캡슐화하여 재사용성이 높은 클래스를 설계하는 패턴이다. 이러한 특징 덕분에 요청을 큐에 저장하거나 로그로 기록할 수 있다. 코드에 적용해보기 일명 기가지니라는 제품을 들어본 적이 있을 것이다. 집에 존재하는 IoT 기기를 어디에서나 쉽고 편하게 조회 및 제어할 수 있는 어플리케이션을 말한다. 하나의 어플리케이션으로 여러 제품의 on, off, 기타 기능 등을 조작할 수 있다. 지금부터 직접 이 어플리케이션을 만드는 작업을 커맨드 패턴을 이용하여 진행할 것이다. 위와 같이 회색 슬롯에 원하는 제품을 끼우고 on, off, 그리고 undo(취소)까지 조작할 .. 2023. 1. 17. 이전 1 2 3 다음