디자인 패턴 16

template method pattern

템플릿 메소드 패턴은 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의한다.템플릿 메소드 패턴의 구성 요소AbstractClass (추상 클래스)알고리즘의 템플릿을 정의하는 클래스로, 템플릿 메소드를 포함하고 있다.템플릿 메소드는 알고리즘의 구조를 정의하고, 일부 단계는 추상 메소드나 구현된 메소드를 활용하여 구현한다.훅(Hook)을 사용하여 서브클래스에서 알고리즘의 특정 지점에 추가적인 동작을 삽입할 수 있다.ConcreteClass (구체 클래스)AbstractClass를 상속받아 템플릿 메소드에서 정의된 추상 메소드들을 구현하는 클래스이다.알고리즘의 일부 단계를 재정의하여 구체적인 동작을 제공한다.필요에 따라 후..

디자인 패턴 2024.07.05

State Pattern

상태 패턴은 객체가 내부적으로 상태를 변경할 때마다 객체의 행동을 바꾸는 패턴이다.이 패턴은 객체의 상태에 따라 객체가 수행하는 동작을 동적으로 변경할 수 있게 한다. 상태 패턴을 사용해야 하는 상황객체의 행동이 상태에 따라 변할 때객체의 행동이 특정 상태에 의존적이고,상태가 변경될 때마다 객체의 행동이 동적으로 변해야 할 때 유용하다.복잡한 조건문 대체상태에 따른 각각의 동작을 개별적인 상태 클래스로 캡슐화하면복잡한 조건문을 피할 수 있다.유집보수 용이성새로운 상태가 추가되거나 기존 상태의 동작이 변경될 때,해당 상태에 대한 클래스만 수정하면 되므로 유지보수가 용이하다. 상태 패턴을 사용하는 경우의 문제점클래스 수 증가각 상태를 별도의 클래스로 구현하기 때문에 클래스의 수가 증가한다상태 전환 오버헤드상..

디자인 패턴 2024.06.15

Singletone Pattern

싱글턴 패턴은 어떤 클래스에 대해 오직 하나의 인스턴스만 생성하도록 하는 디자인 패턴이다.이 패턴을 사용하는 주된 이유 중 하나는 전역 상태를 관리하거나 리소스를 효율적으로 사용하기 위함이다. 왜 정적 변수가 아닌 싱글턴을 써야 하는가?게으른 로딩(Lazy Loading)정적 변수는 클래스가 로딩되는 시점에서 즉시 초기화된다.하지만 게으른 로딩을 통해 인스턴스가 필요한 시점까지 생성을 미룰 수 있는 싱글턴 패턴은 자원을 효율적으로 활용할 수 있다.특히, 애플리케이션이 시작될 때 필요하지 않은 경우에는 초기화를 지연시키는 것이 좋다.동적 로딩(Dynamic Loading)정적 변수는 클래스가 로딩되는 시점에서 생성되기 때문에 동적인 상황에서의 활용이 어렵다.싱글턴 패턴을 사용하면 객체 생성 로직을 변경하지..

디자인 패턴 2024.06.15

Proxy Pattern

프록시 패턴은 다른 객체에 대한 대리자 또는 대변자 역할을 하는 객체를 제공하는 패턴이다.실제 객체에 대한 접근을 제어하거나, 객체에 부가적인 동작을 수행하거나, 객체에 대한 접근을 지연시키는 등의 목적으로 사용된다. 프록시 패턴을 사용하는 상황접근 제어(Access Control):실제 객체에 직접 접근하는 것을 허용하지 않고, 프록시를 통해 접근을 제어하는 경우 사용된다.지연 로딩(Lazy Loading):실제 객체가 필요할 때까지 생성 또는 초기화를 지연시키는 경우 사용된다.추가 동작(Additional Behavior):실제 객체에 접근하기 전에 추가적인 동작을 수행하고자 할 때 사용된다. 프록시 패턴의 구성 요소Subject(주체):프록시와 실제 객체가 공통적으로 구현한 인터페이스 또는 추상 클..

디자인 패턴 2024.06.15

Observer Pattern

옵저버 패턴은 객체 간에 일대다의 의존 관계를 정의하는 디자인 패턴이다.이 패턴은 한 객체의 상태가 변경될 때, 그 객체에 의존하는 다른 객체들에게 알림을 전달하여 자동으로 상태를 갱신하도록 하는 것을 목적이다.주체에서 옵저버에게 데이터를 푸시하는 방법과 주체에서 데이터 변경을 알리면 옵저버가 필요한 데이터를 가져가는 풀 방식이 있다. 데이터 전이 방식 푸쉬 방식풀 방식장점단순성옵저버는 주제에서 직접 데이터를 전달받기 때문에,주제의 상태를 쉽게 파악할 수 있다.유연성 옵저버가 필요한 데이터만 요청하여 가져올 수 있으므로, 불필요한 데이터 전송을 줄일 수 있다.즉시성데이터가 변경될 때마다 즉시 전달되므로,옵저버는 항상 최신 상태를 반영한다.독립성주제의 내부 데이터 구조가 변경되더라도 옵저버에는 영향이 적다..

디자인 패턴 2024.05.30

Mediator Pattern

중재자 패턴은 객체 간의 상호 작용을 캡슐화하여 객체 간의 직접적인 통신을 방지하고, 중재자 역할을 통해 간접적으로 통신하도록 하는 디자인 패턴이다. 객체 간의 통신 로직을 중재자에게 넘겨 결합도를 낮춘다.구성 요소Mediator(중재자):객체 간의 통신을 총괄하며, 객체들 간의 상호 작용을 조정한다. 중재자 인터페이스를 통해 통신 규약을 정의하고, 구체적인 중재자 클래스가 이를 구현한다.ConcreteMediator(구체적인 중재자):Mediator 인터페이스를 구현하며, 객체 간의 상호 작용을 조정한다. 각 객체가 중재자를 참조하여 통신을 진행한다.Colleague(협력자):중재자와 통신하는 객체를 나타내며, Mediator에 등록된다. 각 협력자는 중재자를 통해 다른 협력자와 통신한다.Concret..

디자인 패턴 2024.05.28

Iterator Pattern

반복자 패턴(Iterator Pattern)은 컬렉션(리스트, 배열 등)의 내부 표현을 노출하지 않고, 요소에 하나씩 접근할 수 있도록 하는 디자인 패턴이다. 또한 각 항목에 일일이 접근할 수 있게 해주는 기능을 집합체가 아닌 반복자 객체가 책임진다는 장점도 있다. 그러면 집합체 인터페이스와 구현이 간단해지고, 각자에게 중요한 일만을 처리할 수 있게 된다. 반복자 패턴의 구성 요소Iterator (반복자):집합 객체를 순회하면서 각 요소에 접근하는 인터페이스를 정의한다.요소에 접근하고 순회를 관리하기 위한 메서드들을 포함한다.ConcreteIterator (구체적인 반복자):Iterator 인터페이스를 구현하여 실제 순회 동작을 구현한다.현재 위치를 추적하고 다음 요소로 이동하는 등의 기능을 제공한다.A..

디자인 패턴 2024.05.27

Flyweight Pattern

플라이웨이트 패턴은 많은 수의 유사한 객체를 생성하는 상황에서 메모리 사용을 최적화하기 위한 패턴이다.이 패턴은 객체의 내부 상태 중에서 공유 가능한 부분을 외부로 분리하여 객체들 간에 공유하도록 설계한다. 이를 통해 객체의 수를 줄이고 메모리를 효율적으로 사용할 수 있다.구성 요소Flyweight(플라이웨이트):공유 가능한 객체의 인터페이스를 정의한다. 내부 상태와 외부 상태를 받아들이는 메서드가 있다.ConcreteFlyweight(구체적인 플라이웨이트):플라이웨이트 인터페이스를 구현하고 내부 상태를 가지는 구체적인 클래스입니다. 여러 개의 인스턴스가 생성될 수 있다.FlyweightFactory(플라이웨이트 팩토리):플라이웨이트 인스턴스를 생성하고 관리하는 역할을 한다. 이미 생성된 인스턴스를 재사..

디자인 패턴 2024.05.25

Factory Pattern

팩토리 패턴은 객체 생성을 캡슐화하고, 클라이언트 코드에서 어떤 클래스의 인스턴스를 생성할지 결정하는 패턴이다.이는 객체의 생성을 추상화하여 시스템의 유연성과 확장성을 향상하며, 객체 생성 코드를 클라이언트 코드로부터 분리한다.팩토리 패턴의 종류간단한 팩토리 패턴(Simple Factory Pattern)하나의 팩토리 클래스가 객체의 생성을 담당하는 방식.클라이언트는 팩토리 클래스의 메서드를 호출하여 객체를 생성.class SimpleFactory { public static Product createProduct(String type) { if ("A".equals(type)) { return new ConcreteProductA(); } else if ("B".eq..

디자인 패턴 2024.05.18

Facade Pattern

퍼사드 패턴은 복잡한 시스템이나 서브시스템의 인터페이스를 단순화시켜 사용자에게 간단한 하나의 인터페이스를 제공하는 구조적인 패턴이다.이 패턴은 클라이언트가 복잡한 시스템 내부 구조를 알 필요 없이 특정 기능을 수행할 수 있도록 한다. 퍼사드를 사용해야 하는 상황복잡한 서브시스템이 존재하는 경우:시스템이 여러 개의 복잡한 서브시스템으로 구성되어 있을 때, 각 서브시스템을 단순한 인터페이스로 노출시켜야 하는 경우에 퍼사드 패턴을 사용할 수 있다.클라이언트와 서브시스템 간의 결합도를 낮춰야 하는 경우:서브시스템의 변경이나 교체가 빈번하게 발생하는 경우, 클라이언트와 서브시스템 간의 직접적인 결합을 피하고자 할 때 퍼사드를 도입할 수 있다.인터페이스의 간소화가 필요한 경우:여러 개의 복잡한 인터페이스를 단일한 ..

디자인 패턴 2024.05.12