요약

15. 디자인 패턴 요약 - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2025. 5. 1. 13:33

Singleton : 애플리케이션에서 하나의 객체만 존재하도록 보장하여, 객체를 재사용하고 자원의 낭비를 방지하는데 사용된다.
왜 사용 하는가 : 객체가 여러 번 생성되는 것을 방지하고, 애플리케이션 전체에서 하나의 인스턴스를 공유하기 위해 

Flyweight : 객체의 공유를 통해 메모리 사용을 최적화하는 디자인 패턴
왜 사용 하는가 : 메모리낭비를 막기위해 사용, 불필요한 객체를 생성하지 않고 이미 만들어진 객체를 재활용 하기 위해

Prototype(복제) : 객체를 복사하여 사용하는 것 
왜 사용 하는가 : 객체의 공유를 막고, 각 객체의 독립적인 상태를 유지하기 위해
하나의 객체를 여러 군데에서 공유해서 사용하면 이 객체의 상태가 공유되기 때문에 다른 곳에서의 상태 변화가 모든 곳에 영향을 미치게 된다, 그리고 생성과정이 복잡하고 어려울수록 복제하면 과정과 자원을 아낄수잇다.
복제된 객체를 사용하는 경우 각각의 객체들이 독립된 상태를 가질 수 있다. 각 객체의 상태가 공유되지 않기 때문에 다른 곳에서의 상태 변화가 다른 객체에게 영향을 끼치지 않는다.

Template Method(틀) : 알고리즘의 전체 흐름을 상위 클래스에서 정의하고, 구체적인 단계는 하위 클래스에서 구현하도록 하는 방법
왜 사용 하는가 : 공통된 알고리즘의 흐름을 템플릿 메서드에 정의하여 중복 코드를 줄이고 재사용성을 높일 수 있고, 공통된 로직이 상위 클래스에 집중되므로 변경사항을 추적하고 관리하기 편하며 변경에 유리하다.

Strategy(전략) : 객체의 행위를 정의하는 디자인 패턴, 알고리즘을 선택할 수 있도록 하는 패턴
왜 사용 하는가 : 알고리즘을 하나의 객체로 만들고, 이 객체를 동적으로 변경할 수 있도록 하여, 알고리즘과 클라이언트를 분리하는 것으로, 클라이언트는 여러 알고리즘을 선택할 수 있고, 새로운 알고리즘을 추가할 때 기존 코드를 변경하지 않고도 새로운 전략을 추가할 수 있다.

Bridge(다리) : 기능 클래스 계층과 구현 클래스 계층을 분리해서 각자 독립적으로 확장할 수 있도록 하는 패턴
왜 사용 하는가 : 강한 결합인 상속 대신 약한 결합인 위임을 사용해 기능과 구현이 서로 영향을 주지 않도록 분리하고, 클래스 수 증가 문제를 해결하며, 런타임에 구현 객체를 교체할 수 있는 유연한 구조를 만들기 위함

Iterator(반복) : 집합체의 요소를 통일된 방법으로 순차적으로 접근할 수 있도록 하는 패턴
왜 사용 하는가 : 컬렉션의 내부 구조를 감추고, 클라이언트가 구조에 상관없이 요소들을 처리할 수 있도록 하기 위함

Decorator(장식) : 기존 객체의 코드를 변경하지 않고, 동적으로 새로운 기능을 덧붙이는 패턴
왜 사용 하는가 : 기존 코드를 수정하지 않고 기능을 동적으로 추가하며, 클래스 간 책임을 분리하고 기능을 재사용하기 위함

Proxy(대리인) : 실제 객체에 대한 접근을 제어하기 위해 대리 객체를 두는 패턴
왜 사용 하는가 : 객체 생성 비용이 크거나 접근을 제한해야 할 때, 부가 기능을 추가하고 싶을때 사용한다.

Adapter(래퍼) : 서로 다른 인터페이스를 가진 클래스들을 연결해주는 패턴
왜 사용 하는가 : 관계가 없는 인터페이스를 가진 클래스들을 연결해서 기존 코드의 변경 없이 재사용 하기 위함

Factory Method(공장) : 객체 생성을 하위 클래스에서 결정하도록 하고, 상위 클래스는 생성 방법만 정의하는 패턴
왜 사용 하는가 : 객체 생성 로직을 서브클래스로 분리하여 인스턴스 생성을 캡슐화하고 객체 생성 방식을 유연하게 변경할 수 있도록 하기 위함

Builder(조립) : 복잡한 객체를 단계별로 생성할 수 있도록 분리한 패턴
왜 사용 하는가 : 객체 생성 과정을 단계별로 분리해 복잡한 형태의 객체를 일관된 방식으로 생성하기 위함

Abstract Factory(추상 공장) : 관련 있는 객체들을 일관된 방식으로 생성할 수 있게 해주는 패턴
왜 사용 하는가 : 관련된 객체들을 통일된 방식으로 생성하여 일관성과 호환성을 확보하고 클라이언트가 구체 클래스에 의존하지 않도록 설계하기 위함

Composite(복합물) : 개별 객체와 객체 집합을 동일하게 다뤄 계층 구조를 손쉽게 구성하고 관리할 수 있게 해주는 패턴
왜 사용 하는가 : 계층적 구조를 가진 객체를 일관된 방식으로 처리할 수 있도록 하기 위함

Visitor(방문자) : 객체 구조는 유지한 채 기능을 외부에서 정의하고 추가할 수 있도록 해주는 패턴
왜 사용 하는가 : 객체 구조를 수정하지 않고 새로운 기능을 추가하고 싶을 때 사용한다.

Chain of Responsibility(책임 사슬) : 요청을 처리할 수 있는 객체들을 연결해 순차적으로 처리하게 하는 패턴
왜 사용 하는가 : 요청을 처리할 객체를 고정하지 않고 유연하게 연결해 요청 처리 책임을 객체들 사이에 분산시켜 결합도를 낮추고 유지보수를 쉽게 만들기 위함

Facade(창구-파사드) : 복잡한 시스템을 단순화된 인터페이스로 감싸주는 패턴
왜 사용 하는가 : 복잡한 내부 로직을 감추고 클라이언트에게 단순한 접근을 제공하기 위함

Mediator(중재자) : 객체 간 직접 통신 대신 중재자를 통해 간접적으로 소통하게 하는 패턴
왜 사용 하는가 : 객체 간의 복잡한 의존 관계를 줄이고 객체의 결합도를 낮추기 위함

Observer(관찰자) : 객체의 상태 변화에 따라 의존 객체들이 자동으로 알림을 받는 패턴
왜 사용 하는가 : 상태가 바뀌는 객체가 자신과 느슨하게 연결된 객체들에게 상태 변경을 자동으로 알려 각 객체가 독립적으로 반응할 수 있도록 만들기 위함

Memento(상태 저장) : 객체의 상태를 저장하고 필요할 때 복원할 수 있게 하는 패턴
왜 사용 하는가 : 캡슐화를 유지하면서 이력을 안전하게 저장하기 위함

State(상태) : 객체의 상태에 따라 동작이 변경되는 것을 상태 객체로 분리하는 패턴
왜 사용 하는가 : 상태가 많고 복잡한 경우, 조건문 대신 상태 객체 간 전환을 통해 깔끔한 구조를 유지하기 위함

Command(명령) : 요청을 객체로 캡슐화하는 패턴
왜 사용 하는가 : 실행 명령을 객체로 분리함으로써, 실행과 요청을 분리하고 유연하게 만들기 위함

Interpreter : 문법을 클래스 구조로 표현하고 주어진 표현식을 해석할 수 있게 만든 패턴
왜 사용 하는가 : 자주 사용되는 표현식이나 언어 문법을 객체로 만들어 문장을 해석하고 실행하는 구조를 재사용 가능하게 만들기 위함