/////
Search
📝

5월22일(수)

디자인 패턴

아키텍쳐 설계

서브시스템 수준의 덩어리화(Chunking) 작업

디자인 패턴

전문가의 노하우를 모아놓은 것
전문가의 경험의 경험으로 좋은 설계가 되도록 도와줌 → 검증된 솔루션
코드가 견고하게 만들어줌
재사용에 용이하게 만들어줌
공통의 설계 목표를 만족시키는 클래스의 조합
여러 번의 시행착오를 거치면서, 비슷한 역할의 클래스를 자주 사용하게 됨
이를 잘 모아 목록화한 것

디자인 패턴의 혜택

재사용성 향상, 설계 작업이 쉬워짐, 설계 관련 지식이 정리됨, 디자인 논의를 위한 의사소통이 쉬워짐 객체지향 설계 원리를 잘 따르게 됨

GoF(Gangs of Four) 패턴

생성 패턴(추상 객체 인스턴스화)

추상 팩토리, 팩토리, 빌더, 프로토타입, 싱글톤

구조 패턴(객체 결합)

어뎁터, 브릿지, 컴포지트, 데코레이터, 퍼싸드, 플라이웨이트, 프록시

행위 패턴(객체 간 커뮤니케이션)

책임 체인, 커맨드, 인터프리터, 반복자, 중재자, 메멘토, 옵서버, 상태, 전략, 템플릿 메서드, 비지터
물론, 이런 패턴들 외에도 정말 많습니다. 다 설명하긴 힘들고, 여기서 안 다뤘다고 안 중요한것도 아닙니다. 나머지 패턴들에 대해서도 여러분들이 한 번 꼭 학습을 해서, 코드를 작성할때 도움이 되도록 하면 좋을 것 같다. 그리고, 어떤 문제가 있을때(어떨때 필요한지) 정도만 알아도 분명 도움이 될 것입니다.

싱글톤 패턴

객체를 강제적으로 하나만 생성하려는 목적 EX) DB 커넥션을 위한 인터페이스

방법

1. 클래스 자체를 정적 변수로 2. 생성자는 private으로 선언 3. 유일한 객체를 접근하는 정적 메서드

싱글톤 패턴의 다이어그램

싱글톤 패턴의 예

외부에서는 getInstance() method를 통해서만 인스턴스를 받을 수 있다. 인스턴스는 프로그램 실행 중에 오직 한 번만 생성됨 하지만, 이 예시는, 굳이 안 만들어도 되는 경우에도 만들어두고 사용하는 단점이 존재(메모리 낭비)
윗 예시보다는, 메모리 낭비가 줄었다. 필요할때(호출될때)만 생성하기에, 효율적 그러나, 동시에 다른 두 외부에서 호출되었을때, 동기화되어있지 않아서, 동시에 실행되면 N개가 생성될 가능성이 존재
동기화 로직을 넣음으로써, 동시 호출된 경우에 대해서도 방어 가능

팩토리 패턴

팩토리 : 다른 클래스의 인스턴스를 쉽게 생성하고 리턴하는 임무를 가진 클래스
클라이언트에서 사용할 클래스의 객체를 생성하는 책임을 분리 → 객체 생성에 변화를 대비
생성자를 부르는 대신, 팩토리 클래스의 정적 메소드를 사용하여 객체를 셋업(준비)
구축 정보를 사용 정보에서 분리(응집성 높이고 결합을 약하게) → 객체의 생성과 관리를 쉽게 가능

팩토리 패턴 순서 다이어그램

팩토리 패턴의 예

파일의 유형에 따라 다른 클래스의 인스턴스를 생성

데코레이터 패턴

데코레이터 : 다른 객체의 행위를 바꾸거나 기능을 추가하는 객체
집합 관계와 위임을 사용 → 기존 클래스의 동작을 가볍고 유연하게 확장
객체에 동적으로 책무 추가
데코레이션 당하는 객체가 데코레이터를 알지 못함
랩핑하려는 객체에 동일한 인터페이스를 제공해야함

데코레이터 패넡의 예

기본적으로 데코레이터 패턴은 <상속>을 사용 그러나, 이 경우엔 <정적으로 확장>하기가 어려움 : 클래스 생성하기가 쉽지가 않다
보통 데코레이터 패턴은 다음과 같은 구조를 갖는다. 공통적인 클래스를 상속받아서 뻗어내려가는 구조 : 정적으로 확장하기가 좀 더 용이하다

퍼싸드 패턴

퍼싸드 : “서로 다른 인터페이스 위에 통일된 인터페이스” or “복잡한 인터페이스 위에 간단한 인터페이스제공하는 객체(= 입구 역할)
현재 인터페이스가 너무 복잡하여 쉽게 사용할 수 없거나, 서브 시스템을 사용하는 데 너무 많은 선택이 있을때 → 이때, 퍼싸드 패턴을 통해 해결 가능

플라이웨이트 패턴

플라이웨이트 : 어떤 클래스의 인스턴스도 동일한 상태를 갖지 않는다는 보장이 있어야 함
중복되는 객체가 많을때 EX) 문서 편집기나 오류 메시지에서 사용되는 텍스트나 스트링 구조, 게임에서 캐릭터들, 디스크 내 같은 파일을 나타내는 파일 객체, 그리드에서 점을 나타내는 객체 → 이때, 플라이웨이트 패턴을 통해 해결 가능
객체 구축의 노력을 줄이기 위해 객체들의 동일한 부분을 캐시로 만듦
싱글톤과 유사하나, 많은 인스턴스를 가지며 각 개체마다 고유 상태를 가짐
타입의 인스턴스는 많으나, 각 인스턴스에 유사한 부분이 많은 경우에 유용

플라이웨이트 패턴 예

반복자 패턴

반복자 : 집합에 포함된 각각을 검사하여 반복하여 일을 할 수 있도록 표준 방법을 제공하는 객체
집합 클래스의 자료구조와 상관없이 집합에 소속된 요소들을 쉽게 접근하기 위해 반복자에게 위임
클라이언트가 특정 집합의 유형과 유형별로 접근하고 집계하는 방법신경 안 써도 됨 (어떤 구조가 와도, 유형별로 분류 안하고도 접근하고 집계하면 된다)

반복자 패턴의 예

Iterator() method : Iterator 객체 반환 → Iterator 객체를 이용해서 인덱스 없이 순차적 검색 가능
Set(집합)은 리스트와는 달리, 순서가 없는 것!