Deep Dive Into Design Patterns - 빌더 패턴

    💡 빌더(Builder) 패턴이란?객체를 생성하기 전에 점진적으로 객체의 정보를 수집하여 복잡한 객체들을 단계 별로 생성하는 생성 디자인 패턴입니다. 생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식입니다. 일반적으로는 생성자를 제공하여 객체를 생성하지만, 생성 객체에 초기값을 주거나 생성할 클래스를 선택하고 싶을 때 변형이 필요합니다. 즉, 객체 생성을 클래스 로직 밖으로 옮길 필요가 있을 때 빌더 패턴을 사용합니다.public static void main(String[] args) { // 생성자 방식 Hamburger hamburger = new Hamburger(2, 3, 0, 3, 0, 0); // 빌더 방식 Hambu..

    Deep Dive Into Design Patterns - 플라이웨이트 패턴

    💡 플라이웨이트(Flyweight) 패턴이란?재사용 가능한 객체 인스턴스를 공유시켜 메모리 사용량을 최소화하는 구조 패턴입니다. 각 객체에 모든 데이터를 유지하는 대신 여러 객체들 간에 상태의 공통 부분들을 공유하여 사용할 수 있는 RAM에 더 많은 객체들을 포함할 수 있도록 합니다. 자주 변하는 속성(extrinsic)과 변하지 않는 속성(intrinsic)을 분리하고, 변하지 않는 속성을 캐시하여 재사용해 메모리 사용을 줄입니다. 그래서 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 최적화를 노리는 경량 패턴이라고 불립니다. 💡 클래스 다이어그램으로 본 플라이웨이트 패턴Flyweight : 경량 객체를 묶는 인터페이스.Flyweight State : 플라이웨이..

    Deep Dive Into Design Patterns - 책임 연쇄 패턴

    💡 책임 연쇄(Chain of Responsibility) 패턴이란?핸들러들의 체인(사슬)을 따라 요청을 전달할 수 있게 해주는 행동 디자인 패턴입니다. 클라이어트의 요청에 대한 세세한 처리를 하나의 객체가 몽땅 하는 것이 아닌, 여러 개의 처리 객체들로 나누고, 이들을 사슬(chain)처럼 연결해 집합 안에서 연쇄적으로 처리하는 행동 패턴입니다. 이러한 처리 객체들을 핸들러(handler)라고 부르는데, 요청을 받으면 각 핸들러는 요청을 처리할 수 있는지 판단하고, 없으면 체인의 다음 핸들러로 처리에 대한 책임을 전가합니다. 처리에 대한 책임을 요청을 보내는 쪽(sender)과 요청을 처리하는(receiver) 쪽을 분리하여 각 객체를 부품으로 독립시키고 결합도를 느슨하게 만들며, 상황에 따라서 요청..

    Deep Dive Into Design Patterns - 프록시 패턴

    💡 프록시 패턴이란?대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름을 제어하는 행동 패턴입니다. “프록시”의 사전적인 의미인 ‘대리인’처럼, 클라이언트가 대상 객체를 직접 사용하는 게 아니라 중간에 프록시(대리인)을 거쳐서 사용하는 코드 패턴입니다. 따라서 대상 객체(Subject)의 메소드를 직접 실행하는 것이 아닌, 대상 객체에 접근하기 전에 프록시(Proxy) 객체의 메서드를 접근한 후 추가적인 로직을 처리한뒤 접근하게 됩니다. 프록시는 실제 객체에 액세스하지 않고, 정상적 또는 비정상적인 메시지를 처리할 수 있게끔 합니다. 💡 프록시 패턴을 쓰는 이유프록시 패턴은 대상 클래스가 민감한 정보를 가지고 있거나 인스턴스화 하기에 무겁거나 추가 기능을 가미하고 싶은데, 원본 객체를 수정..

    Deep Dive Into Design Patterns - 중재자 패턴

    💡 중재자(Mediator) 패턴이란? 객체 간의 혼란스러운 의존 관계들을 줄일 수 있는 행동 디자인 패턴입니다. 이 패턴은 객체 간의 직접 통신을 제한하고 중재자 객체를 통해서만 협력하도록 합니다. 중재자 패턴은 각 객체들의 강한 연결(참조)를 끊고, 그 대신 컴포넌트들이 특수 중재자 객체를 호출하여 적절한 컴포넌트들로 리다이렉션하게끔 합니다. 이로 인해 컴포넌트들은 간접적으로 협력하게 되고, 수십 개의 동료 컴포넌트들과 결합되는 대신 단일 중재자 클래스에만 의존합니다. ⭐ 옵서버 패턴과 중재자 패턴? 옵서버 패턴은 1개의 발행자에 N개의 구독자가 존재하여 옵서버가 발행을 담당하고 중재자 패턴은 M개의 퍼블리셔와 N개의 구독자 사이에서 1개의 중재자를 통해 통신합니다. 옵서버 패턴은 재사용성은 좋지만 ..

    Deep Dive Into Design Patterns - 옵서버 패턴

    💡 옵서버(Observer) 패턴이란? 객체에 발생하는 모든 이벤트에 대하여 옵서버(관찰자)들에게 알리고, 옵서버들은 알림을 받아 조치를 취하는 행동 패턴입니다. 일명 구독 매커니즘을 구현한 패턴으로, 다른 디자인 패턴들과 다르게 일대다 의존성을 가집니다. 옵서버 패턴의 예시로는 MVC 패턴(Model, View, Controller)이 있습니다. MVC의 Model과 View의 관계는 Observer 패턴의 Subject 역할과 Observer 역할의 관계에 대응됩니다. 즉, 하나의 Model에 복수의 View가 대응합니다. 💡 클래스 다이어그램으로 본 옵서버 패턴 Publisher(Subject) : 관찰 당하는 대상으로, Subscriber(Observer)들을 리스트로 갖고 있다. (Aggrega..

    Deep Dive Into Design Patterns - 싱글톤 패턴

    💡 싱글톤(Singleton) 패턴이란? 클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근(액세스) 지점을 제공하는 생성 디자인 패턴입니다. 쉽게 말해, 단 하나의 유일한 객체를 만들기 위한 코드 패턴이며 인스턴스가 필요할 때 똑같은 인스턴스를 새로 만들지 않고 기존의 인스턴스를 가져와 활용하는 기법을 말합니다. 보통 싱글톤 패턴이 적용된 객체가 필요한 경우는 그 객체가 리소스를 많이 차지하는 역할을 하는 무거운 클래스일때 적합합니다. 대표적으로 데이터베이스 연결 모듈을 예로 들 수 있는데, 데이터베이스에 접속하는 작업(I/O 바운드)은 그 자체로 무거운 작업에 속하며 또한 한번만 객체를 생성하고 돌려쓰면 되지 굳이 여러번 생성할 필요가 없기 때문입니다. 💡 클래스 다이어그램으로 본..

    Deep Dive Into Design Patterns - 브리지 패턴

    💡 브리지 패턴이란? 큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조(추상화 및 구현)로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 구조 디자인 패턴입니다. 💡 문제? Circle(원) 및 Square(직사각형)라는 한 쌍의 자식 클래스들이 있는 기하학적 Shape(모양) 클래스가 있다고 가정해 봅시다. 이 클래스 계층 구조를 확장하여 색상을 도입하기 위해 Red(빨간색) 및 Blue(파란색) 모양들의 자식 클래스들을 만들 계획입니다. 그러나 이미 두 개의 자식 클래스가 있으므로 Blue­Circle(파란색 원) 및 Red­Square(빨간색 직사각형)와 같은 네 가지의 클래스 조합을 만들어야 합니다. 새로운 모양 유형들과 색상 유형들을 추가할 때마다 계층 구조는 기하급수적..

    Deep Dive Into Design Patterns - 컴포지트 패턴

    💡 컴포지트(복합체) 패턴이란? 객체들을 트리 구조들로 구성한 후, 이러한 구조들을 개별 객체들처럼 작업할 수 있도록 하는 구조 패턴입니다. 즉, 복합 객체(Composite)와 단일 객체(Leaf)를 동일한 컴포넌트로 취급하여 클라이언트가 무엇이 복합 객체이고 무엇이 단일 객체인지 구분하지 않고도 사용할 수 있게끔 하는 패턴입니다. 💡 클래스 다이어그램으로 본 컴포지트 패턴 Component(인터페이스) : Leaf와 Compsite 를 묶는 공통적인 상위 인터페이스 Composite : 복합 객체로서, Component 구현체들을 내부 리스트로 관리 Leaf : 단일 객체로서, 하위 요소가 없다. Client : Component Interface를 통해 단일/복합 객체를 하나의 객체로 다룬다. 복합..

    Deep Dive Into Design Patterns - 퍼사드 패턴

    💡 퍼사드 패턴이란? 라이브러리에 대한, 프레임워크에 대한, 또는 다른 클래스들의 복잡한 집합에 대한 단순화된 인터페이스를 제공하는 구조적 디자인 패턴입니다. 라이브러리의 각 클래스와 메서드들이 어떤 목적의 동작인지 이해하기 어려워 바로 가져다 쓰기에는 난이도가 높을 때, 이에 대한 적절한 네이밍과 정리를 통해 사용자로 하여금 쉽게 라이브러리를 다룰 수 있도록 인터페이스를 만드는 데 사용합니다. ⭐ 퍼사드는 움직이는 부분이 많이 포함된 복잡한 하위 시스템에 대한 간단한 인터페이스를 제공하는 클래스입니다. 💡 클래스 다이어그램으로 본 퍼사드 패턴 퍼사드 패턴을 사용하면 하위 시스템 기능들의 특정 부분에 편리하게 접근할 수 있습니다. 또한, 퍼사드는 클라이언트의 요청을 어디로 보내야 하는지와 움직이는 모든 ..

    Deep Dive Into Design Patterns - 어댑터 패턴

    💡 어댑터 패턴이란? 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 구조적 디자인 패턴입니다. 📌 문제 상황 주식 시장 모니터링 앱을 만들고 있고, 이 앱은 여러 소스에서 주식 데이터를 XML 형식으로 다운로드한 후 사용자에게 보기 좋은 차트들과 다이어그램들을 표시한다고 상상해 봅시다. 어느 시점에 당신은 타사의 스마트 분석 라이브러리를 통합하여 당신의 앱을 개선하기로 결정했습니다. 그런데 이 분석 라이브러리는 JSON 형식의 데이터로만 작동합니다. 즉, 앱과 라이브러리가 호환되지 않는 상황입니다. 이 라이브러리를 XML과 작동하도록 변경할 수 있으나, 그러면 라이브러리에 의존하는 일부 기존 코드가 손상될 수 있습니다. 또 처음부터 타사의 라이브러리 소스 코드에 접근하는 것이 불가능하여..

    Deep Dive Into Design Patterns - 디자인 패턴의 개요

    💡 패턴 자세히 알아보기📌 생성 패턴 Deep Dive Into Design Patterns - 싱글톤 패턴💡 싱글톤(Singleton) 패턴이란? 클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근(액세스) 지점을 제공하는 생성 디자인 패턴입니다. 쉽게 말해, 단 하나의 유일한 객체를easyhomputer.tistory.com 📌 구조 패턴 Deep Dive Into Design Patterns - 어댑터 패턴💡 어댑터 패턴이란? 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 구조적 디자인 패턴입니다. 📌 문제 상황 주식 시장 모니터링 앱을 만들고 있고, 이 앱은 여러 소스에easyhomputer.tistory.com Deep Dive Into Desig..