Computer Science/디자인패턴

    Singleton Pattern과 Inversion of Control

    Singleton PatternInstance가 생성될때 오직 하나의 Instance가 생성되는 것을 보장하는 것을 목표로 하는 디자인 패턴. SingleTon Pattern의 여러 Client들이 접근하는 객체를 하나의 메모리 공간에서 관리할 수 있기 때문에 메모리 효율성이 좋고 객체의 상태관리를 하기에 용이하다.하지만 이러한 Singleton Pattern은 Application Level에서의 Global State로써 동작하기 때문에 복잡한 의존성 관리와 멀티쓰레드 상황에서 쓰레드 안정성이 주된 단점으로 뽑히게 된다.이러한 Singleton Pattern의 단점을 보완하기 위해 적용하는 것이 Inversion of Control 패턴이다.Inversion of Control객체의 의존성 관리 및 ..

    [디자인 패턴] 이터레이터 패턴

    [디자인 패턴] 이터레이터 패턴

    컬렉션의 구현에 관계 없이 Client가 탐색할 수 있는 방법 제공을 하는 것을 목표로 하는 행동 디자인 패턴이다. 컬렉션이란? 자바에서 "컬렉션(Collection)"은 여러 객체(요소)를 모아 처리할 수 있는 인터페이스와 클래스의 집합을 의미한다. 컬렉션 프레임워크는 데이터를 저장, 검색, 수정, 삭제 등을 효율적으로 관리하기 위한 구조적인 방법을 제공한다. 다음은 List와 Queue들에 대해서 원소들을 순회하는 방식이다. List의 순회방식 import java.util.ArrayList; import java.util.List; public class ListExample { public static void main(String[] args) { List stringList = new Arr..

    [디자인 패턴] 템플릿 메서드 패턴

    [디자인 패턴] 템플릿 메서드 패턴

    개념 템플릿 메서드 패턴은 행위 패턴의 일종으로 객체의 메소드에 대해서 변경이 되는 부분들에 대해서 서브 클래스의 그 책임을 위임하는 패턴이다. 추상 기본 클래스 : 템플릿 메서드(알고리즘의 골격)을 정의하며, 이 클래스에는 알고리즘의 각 단계를 실행하는 메서드도 정의된다. 일부 메서드는 기본 클래스에서 정의되며 일부는 서브클래스에서 반드시 구현되어야하는 추상 메서드일 수 있다. 구체적인 클래스 : 추상 기본 클래스를 상속받아 특정 단계를 구체적으로 구현한다. 이러한 구현은 알고리즘의 변하지 않는 구조내에서 특정 작업을 수행한다. 구현 https://github.com/RicardoKim/DesignPattern-Go-/tree/main/template_method_pattern DesignPattern..

    [디자인 패턴] 어댑터 패턴

    [디자인 패턴] 어댑터 패턴

    구조 패턴 구조 패턴은 설계에 있어서 객체와 클래스의 조합을 통해 더 큰 구조를 만드는 방법을 제공하는 디자인 패턴이다. 이 패턴들은 다음 3가지 를 중점으로 설계가 된다. 재사용성 : 이미 존재하는 클래스나 객체를 새로운 구조로 쉽게 재사용할 수 있게 해준다. 확장성 : 시스템의 일부분만 변경하거나 확장해도 전체 구조에 영향을 미치지 않도록 설계하는 것. 독립성 : 구현과 추상화를 분리하여 독립적으로 개발할 수 있게 하며 시스템의 복잡성 관리에 영향을 준다 어댑터 패턴 어댑터 패턴은 구조패턴에서 재사용성에 좀 더 초점을 맞춘 패턴이다. 어댑터 패턴은 호환되지 않는 인터페이스를 가진 레거시 클래스를 어댑터를 사용해서 새로 만드는 코드 시스템에 녹여내는 것에 목적이 있다. 호환되지 않는 클래스들이 함께 작..

    [디자인 패턴] 커맨드 패턴

    [디자인 패턴] 커맨드 패턴

    필요성 client코드에서 다양한 객체들을 호출을 하게 되는 상황을 가정해보자. 객체들을 행동들은 제각기 상이할 것이고 client코드는 이러한 상이한 객체들의 행동들의 순서 및 메소드들에 결합이 강하게 되는 상황이 발생할 것이다. 이러한 예시는 OS에서 프로세스를 실행시키는 상황에서 볼 수 있다. 프로세스들에서 실행시키고자 하는 동작은 각기 다를 것이지만 커널은 이러한 프로세스를 호출해서 실행시키는 것을 반복해야한다. 그렇다고 커널들이 모든 프로세스들의 동작을 알고 있다는 것은 현실상 불가능하다. 따라서 행동을 하는 코드와 호출을 하는 코드 사이의 결합도를 낮출 방법이 필요하고 이러한 경우에 사용하는 것이 커맨드 패턴이다 커맨드 패턴 커맨드 패턴이란 객체의 행동을 캡슐화 하여 이를 호출하는 객체로 하여..

    [디자인 패턴] 팩토리 패턴

    [디자인 패턴] 팩토리 패턴

    생성 패턴이 필요한 이유 생성 패턴이란 객체 생성과정을 보다 유연하고 효율적으로 만들기 위해 사용된다. 이들을 사용하는 이유는 다음과 같다. 1. 객체 생성과 구현을 분리: 생성패턴을 사용하면 객체를 생성하는 로직과 해당 객체를 사용하는 구현부의 로직을 분리할 수 있다. 이를 통해 코드의 시인성 향상, 역할 분리등의 입장에서 강점을 가질 수 있다. 2. 코드 재사용성 증가: 특정 객체를 생성하는 로직을 통일 시키게 되면 해당 객체를 사용하는 모든 메소드에서 동일한 생성로직을 가지는 객체를 활용할 수 있어진다. 3. 시스템의 유연성 증가 및 확장 : 1,2번과 같은 이유로 객체의 생성로직이 달라지거나 혹은 새롭게 객체를 추가할 때 해당 객체의 생성 부분만 변경하거나 추가하면 되기 때문에 시스템의 유연성과 ..

    [디자인 패턴] 데코레이터 패턴

    [디자인 패턴] 데코레이터 패턴

    상속의 문제 A회사의 알림 메세지 기능이 존재한다. 알림 메세지 기능은 특정 이벤트가 발생한 경우 수신자에게 메세지로 알림을 전송하는 역할을 한다. 근데 갑자기 협력사에서도 알람을 달라고 한다. B협력사는 슬랙으로, C협력사는 카카오톡으로, D협력사는 슬랙과 메세지지로.... 이 상황에서 우리는 다음과 같은 구성을 쉽게 생각할 수 있다. 위와 같은 구조의 문제점을 생각해보자. 메세지의 종류가 10가지 종류가 있다면 어떻게 해야할까? 전체 구현해야하는 클래스의 갯수는 10! -1 이다. 생각만 해도 끔찍하다. 그리고 더 끔찍한거는 메세지의 전송방식이 바뀌는 상황이다. 그러면 일일이 해당 방식이 구현된 곳을 찾아 코드를 변경해야한다. 이 시점에서 우리는 아래의 디자인 원칙을 다시 살펴볼 필요가 있다. 디자인..

    [디자인 패턴] 옵저버 패턴

    [디자인 패턴] 옵저버 패턴

    정의 한 객체가 상태가 바뀌면 그 객체에 의존하는 다른 객체에 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의하는 패턴 주체는 상태가 바뀌는 객체이고 옵저버는 이러한 주체의 상태를 관찰하는 객체이다. 주체가 상태가 갱신이 되었을 때 옵저버가 수동적으로 주체한테 정보를 받게 되면 푸시방식, 옵저버가 필요할 때 주체의 상태를 가져오게 되면 풀 방식으로 불린다. 장점 느슨한 결합 : 두 객체가 상호작용을 할 때 서로에 대해서 강하게 결합이 되지 않게 되면 객체의 변화가 다른 객체로 전파되지 않는다. 옵저버 패턴을 사용하면 주제 객체와 옵저버 객체들은 상호작용을 하긴 하지만 서로 강하게 결합되지 않아 동적인 구독 관리 : 옵저버는 구독하고 있는 객체의 목록을 관리하기 때문에 옵저버가 추가되거..