iOS개발자를 위한 디자인패턴 30분만에 정복하기
는 함정이구요. 30분 만에 정복하는 건 무립니다.
제대로 정복하기 위해서는 예제도 만들어 보고, 이해하기 위한 노력이 필요합니다.
하지만 GoF의 디자인패턴 책에서 강조하고 있는 것처럼 디자인 패턴은 “커뮤니케이션 도구”로써의 역할도 훌륭합니다.
아래 내용은 각 디자인 패턴이 어떤 걸 말하는 것인지를 빠르게 이해하고, 되새길 수 있는 역할을 해줄 것입니다.
따라서 아래 내용을 팀 멤버들과 공유하면, 특정 코드가 어떤 디자인 패턴으로 구현되었는지를 설명하여, 커뮤니케이션 비용을 아낄 수 있습니다.
생성 패턴
- 추상 팩토리 패턴
- 생성만 하는 팩토리
- 서로 관련 있는 객체들의 집합을 만들 수 있는 프로토콜(인터페이스)를 제공
- 관련패턴
- 팩토리 메서드 패턴이 여러개 모이면 추상팩토리와 같은 모양이 됨
- 참고 : https://dzone.com/articles/factory-method-vs-abstract
- 팩토리 메서드 패턴이 여러개 모이면 추상팩토리와 같은 모양이 됨
- 팩토리 메서드 패턴
- 생성되는 객체의 구체적 타입을 서브 클래스에서 정하도록 하는 것
- 프로토콜에는 생성에 관여하는 메서드가 정의됨
- 이 메서드의 결과는 프로토콜 혹은 부모 클래스
- 이 클래스는 생성 전용이 아님
- 빌더 패턴
- 프로퍼티들의 초기값을 순서나 필수 여부에 관계없이 체이닝 형식으로 자유롭게 지정 가능함.
- 싱글 턴
- 1개만 있다는 게 보장 되어야 할 때
- 프로토타입 패턴
- 기본 객체를 만들어 놓고 복사해서 사용
- 널 객체 패턴
- null 체크가 퍼져 나갈 때
- 기본값을 정할 수 있을 때
구조 패턴
- 어댑터 패턴(레퍼)
- 클라이언트가 기대하는 인터페이스로 변환
- 파사드 패턴
- 라이브러리의 간략한 인터페이스 제공
- 어댑터랑 비슷하지만 목적만 다름.
- 프록시 패턴
- 어댑터랑 비슷한데, 접근을 통제하기 위한 목적
- 다른 객체로의 접근을 통제하기 위해서 다른 객체의 대리자 또는 다른 객체로의 정보 보유자를 제공한다.
- 데코레이터와 매우 유사, 의도의 차이, 프록시는 실제 객체에 대한 접근을 제어하는 데 초점, 데코레이터는 기존 객체의 기능을 확장하는데 초점
- 가상프록시 (Virtual Proxy)
- 실체를 대표할 수 있는 대리자
- DB 나 네트워크 너머에 있는 어떤 리소스
- 캐시가 그 예가 될 수 있다
- 특성상 실체의 모든 기능을 구현하지는 않는다.
- 실체를 대표할 수 있는 대리자
- 보호 프록시 (Protection Proxy)
- 접근 제어가 목적이다.
- 스마트 레퍼런스 (Smart Reference)
- 실제 객체에 접근할 때 부가적인 기능을 수행할 수 있다.
- 브릿지 패턴
- 추상화와 구현을 분리하여 각각을 독립적으로 변형할 수 있게 한다(?)
- 말만 어렵지 추상화된 프로토콜(인터페이스)로 분리한다는 의미
- 컴포지트 패턴
- 트리 구조
- 부모와 자식이 서로 교환 가능한 구조
- 데코레이터
- 같은 프로토콜(인터페이스)을 구현한 놈으로 감싼다
- 응답 체인 패턴과 비슷한 모양새가 되지만 목적이 다름. 이건 기능 추가가 목적임
- 플라이웨이트 패턴
- 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 공유하여 메모리 사용량을 줄이는 것
- UITableViewController가 UITableViewCell의 공통 데이터를 가지고 있는 방식
행위 패턴
- 응답 체인 패턴(Chain of Responsibility)
- 처리 돌려 막기
- 처리 가능한 놈이 나올 때까지 넘기기
- 데코레이터 패턴과 모양이 비슷하지만 이 놈의 목적은 올바른 객체를 찾아서 일을 시키기 위한 것
- 커맨드 패턴
- 요청을 객체로 캡슐화
- 인터프리터 패턴
- 컴포지트 패턴하고 비슷한 구성을 만들고 각자에 언어 구문을 평가/해석하는 방법이 기술되어 있다.
- 이터레이터 패턴
- 돌면서 값을 꺼내올 수 있는..
- 비지터 패턴
- 돌면서 같은 방법으로 일을 시킬 수 있는
- 응답 체인패턴과 다른 점은 Visitor가 따로 존재한다는 것
- 그리고 구성원 모두에게 일을 시킨다는 것
- 미디에이터 패턴
- 객체 간의 결합도를 줄이기 위한 방법, 서로 Delegate 패턴으로 연결
- 메멘토 패턴
- undo/redo
- 옵저버 패턴
- 관찰자와 관찰가능한 객체
- 스테이트 패턴
- 컴포지션한 대상이 상태를 나타내면
- 스트레티지 패턴
- 컴포지션한 대상이 알고리즘을 나타내면
- 템플릿 메서드 패턴
- 메서드 실행 순서가 중요할 때