4. Design Patterns
Why are patterns important
“패턴이 있다”라고 하는 이야기는 반복되어 사용된다는 이야기
이고, 반복해서 적용할 수 있다는 이야기 입니다.
잘 설계된 패턴이 있다면, 이를 반복해 적용해서 코드와 디자인
을 재사용해서 개발 효율을 높일 수 있습니다.
패턴은 커뮤니케이션 도구로 사용되기도 합니다. 예를 들어 실
업무상에서 그 객체는 Singleton이 좋겠어요. Factory 구현이 필
요하네요. 라는 식으로 의사소통을 하는 경우가 많이 있습니다.
패턴이 가지는 구조가 추상화 되어 이름만으로 그 내용을 알 수
있기 때문에 효과적인 의사소통이 가능합니다. 반대로 패턴을 이
해하지 못하고 있으면 무슨 말을 하는지 알지 못합니다.
6. Creational Patterns
Abstract Factory
Definition
실제 클래스를 명시하지 않고도 관련성이 있거나 의존적인 객체
들을 생성하기 위한 인터페이스를 제공합니다.
Usage
Factory가 실제 생성할 객체를 결정합니다. 그런데 이 factory
는 실제 생성할 객체의 abstract pointer를 반환합니다.
이렇게 해서 클라이언트 코드와 실제 클래스 생성 코드를 분리
할 수 있습니다.
Also Known As
Kit
9. Creational Patterns
Abstract Factory
Where to use
• 객체가 생성되거나 구성, 표현되는 방식과 무관한 시스템을
만들고자 할 때
• 여러 모듈 중 하나를 선택해서 시스템을 설정해야 하고 한번
구성한 모듈을 다른 것으로 대체할 수 있을 때
• 관련된 모듈 객체들이 함께 사용되도록 설계되었고, 이 부분
에 대한 제약이 외부에도 지켜지도록 하고 싶을 때
• 모듈에 대한 클래스 라이브러리를 제공하고, 그들의 구현이
아닌 인터페이스를 노출시키고 싶을 때
10. Creational Patterns
Abstract Factory
Benefits
• 구현 클래스를 분리
• 팩토리 모듈의 대체가 쉬움
• 모듈 사이의 일관성을 증진시킴
Drawbacks/consequences
• 새로운 종류의 모듈을 사용하기는 어려움(Abstract Factory
를 상속받지 않은)
12. Creational Patterns
Builder
Structure
Builder 객체를 생성을 위한 인터페이스
ConcreteBuilder 빌더를 구현한 클래스. 이것은 다른 객체(product)를 생성
할 수 있는 객체입니다. 객체(product) 생성에 생성한
parts를 assembling하여 객체를 생성합니다.
Director 디렉터 클래스는 객체 생성에 필요한 절차를 거치고 관리
할 책임을 집니다.
Product 디렉터가 빌더를 사용해 생성하는 최종 객체입니다.
14. Creational Patterns
Builder
Where to use
• 복합 객체의 생성 알고리즘은 각 요소에 의존적이지 않아야
하고 각 부분을 어떻게 구성하더라도 상관이 없어야 사용할
수 있습니다.
• 생성절차에서 생성된 객체의 다른 표현을 허용해야만 합니다.
16. Creational Patterns
Factory Method
Definition
객체 생성을 위한 인터페이스를 정의하지만, 어떤 클래스의 인
스턴스를 만들지 결정은 서브클래스가 담당합니다.
Usage
Factory는 다른 오브젝트를 생성하기 위한 객체입니다. 이것은
추상화된 생성자인데, 여러가지 형태로 구현되어 사용할 수 있
습니다.
Also Known As
Virtual Constructor
24. Creational Patterns
Prototype
Where to use
• 객체의 인스턴스화가 런타임에 구체화 될 때 예) 동적 로딩
• 생성물의 계층과 병렬적인 팩토리 계층의 클래스를 만드는
것을 피하고 싶을 때
• 클래스의 인스턴스들이 단지 몇 개의 상태의 조합에 불과할
때
• 클래스의 수를 최소화 하고 싶을때
• 클래스에 따라 동적으로 어플리케이션을 설정하고 싶을 때
29. Creational Patterns
Singleton
Where to use
• 클래스의 인스턴스가 단 하나이어야 할때, 그리고 잘 알려진
진입점으로 부터 접근 가능해야 할때
• 하나의 인스턴스가 서브클래싱 방법을 이용해 확장 가능해야
할때, 클라이언트는 코드 수정 없이 extended intance를 사
용할수 있어야 할때
30. Creational Patterns
Singleton
Benefits
• 유일한 인스턴스로 접근 제어가 가능
• 네임스페이스를 줄임
• 연산과 표현의 개선이 가능함
• 인스턴스의 수를 조절할 수 있음
• 클래스 연산을 사용한 방법보다 유연함 (static의 경우
override 불가)
Drawbacks/consequences
• Singleton pattern의 오남용하게 되면, 실제로 유일한 인스턴
스가 필요하지 않은 경우에도 불필요한 제한을 가하게 됩니
다.
35. Structural Patterns
Adapter
Where to use
• 기존에 사용하던 클래스를 사용하려고 하는데 필요한 인터페
이스와 맞지 않을 때
• 관련성이 없거나 예측하지 못했던 클래스에 맞게 동작시키기
위한 재 사용 가능한 클래스를 만들려고 할 때
• 클래스의 투명성을 증가시키고 싶을 때
39. Structural Patterns
Bridge
Example
StructuralBridge.java
None comes to mind yet. A fictive example would be new
LinkedHashMap(LinkedHashSet<K>, List<V>) which returns
an unmodifiable linked map which doesn't clone the items,
but uses them. The java.util.Collections#newSetFromMap()
and singletonXXX() methods however comes close.
40. Structural Patterns
Bridge
Where to use
• 구조/개념과 구현이 영구적으로 바인딩 되는 것을 피하고 싶
을 때
• 구조/개념과 구현 모두 상속 가능하게 하고 싶을 때
• 구조/개념을 구현한 구현의 변경이 클라이언트에 미치는 영
향이 없게 하려 할때
• 구현 내용을 클라이언트로 부터 완전히 숨기고 싶을때 (C++)
• 구현을 다수의 객체에게 공유하고자 하지만, 이 사실을 클라
이언트에게 숨겨야 할 때
41. Structural Patterns
Bridge
Benefits
• 구현을 런타임에 선택하거나 교체할 수 있음
• 추상(구조/개념)과 구현을 각자 독립적으로 확장하거나 합성
할 수 있음
Drawbacks/consequences
• 간접 구현의 중복, 약간의 performance의 이슈가 생길 수 있
음
46. Structural Patterns
Composite
Benefits
• primitive 객체와 composite 객체로 구성된 클래스 계층 구
조를 정의함
• 클라이언트 코드가 간단해짐
• 새로운 종류의 component를 추가하기가 쉬워짐
Drawbacks/consequences
• 지나치게 일반적인 설계가 될 수 있음(제약을 가하기 어려움)
49. Structural Patterns
Decorator
Example
StructuralDecorator.java
All subclasses of java.io.InputStream, OutputStream, Reader
and Writer have a constructor taking an instance of same
type.
Almost all implementations of java.util.List, Set and Map
have a constructor taking an instance of same type.
java.util.Collections, the checkedXXX(), synchronizedXXX()
and unmodifiableXXX() methods.
javax.servlet.http.HttpServletRequestWrapper and
HttpServletResponseWrapper
51. Structural Patterns
Decorator
Benefits
• 단일(다중) 상속보다 유연함
• 상위 계층의 클래스에 feature가 몰리는 것을 방지
Drawbacks/consequences
• 서로 연결된 작고 많은 수의 객체가 생기기 때문에, 전체 시
스템을 잘 이해하고 있지 않으면 커스트 마이징하거나 디버
깅이 어려울 수 있음.
• Decorator의 chain이 긴 경우 performance overhead가 발
생할 수 있음.
54. Structural Patterns
Facade
Example
StructuralFacade.java
javax.faces.context.FacesContext, it internally uses among
others the abstract/interface types LifeCycle, ViewHandler,
NavigationHandler and many more without that the
enduser has to worry about it (which are however
overrideable by injection).
javax.faces.context.ExternalContext, which internally uses
ServletContext, HttpSession, HttpServletRequest,
HttpServletResponse, etc.
56. Structural Patterns
Facade
Benefits
• 클라이언트에게 서브시스템 구성요소를 숨김
• 클라이언트가 관여하는 객체 수가 줄어들고 서브시스템 사용
을 쉽게 함
• 서브시스템과 클라이언트간에 커플링을 약하게 함
Drawbacks/consequences
• 어플리케이션이 서브시스템 클래스를 사용하려고 할 때 이를
막지는 못함. 그러므로 쉬운 사용방법과 일반적인 방법 중에
하나를 골라서 사용할 수 있음
60. Structural Patterns
Flyweight
Where to use
• 어플리케이션이 많은 수의 객체를 사용할 때
• 객체의 양이 많아 저장 비용이 클 때
• 대부분 객체의 상태를 객체 외적인 것으로 만들 수 있을 때
• 많은 객체 그룹이 객체 외적인 요소가 제거된 상대적으로 작
은 수의 공유 객체로 교체가 가능할 때.
• 어플리케이션이 객체의 identity에 의존적이지 않을 때.
65. Structural Patterns
Proxy
Where to use
• remote proxy는 다른 주소 공간을 위한 local
representative를 제공
• virtual proxy는 요구에 따라 생성되는 고비용 객체를 생성
• protection proxy는 오리지널 객체의 접근을 제어(권한)
• smart reference는 단순 포인터를 대체하는 것으로 객체에
대한 접근이 이루어졌을 때 추가적인 동작을 함
66. Structural Patterns
Proxy
Benefits
• remote proxy는 객체가 다른 주소공간에 존재한다는 사실을
숨길 수 있음
• virtual proxy는 퍼포먼스를 최적화 시킬 수 있음(필요할 때
만 객체 생성을 한다는 방법 등)
• protection proxy와 smart reference는 객체에 대한 접근이
일어났을 때 추가적인 보호 작업을 할 수 있음.
Drawbacks/consequences
• 객체에 대한 추가적인 추상 레벨을 제공(어떤 객체에 직접 접
근하는것과 프록시를 통해 접근하는 것에는 차이가 있을 수
있으며 이것은 제작자가 의도하거나 의도하지 않은 것 일 수
있음)
70. Behavioral Patterns
Chain of Responsibility
Example
BehavioralChain of Responsibility.java
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
71. Behavioral Patterns
Chain of Responsibility
Where to use
• 한 개 이상의 객체가 요청을 핸들링 하고 핸들러는 우선순위
를 모를때. 핸들러는 자동으로 지정해 주어야만 함
• 예상 receiver가 누구인지 명시하지 않고, 몇몇 객체 중 하나
에게 요청을 발행하고 싶을 때
• 요청을 처리할 객체 셋이 동적으로 정해져야 할 때
76. Behavioral Patterns
Command
Where to use
• action 수행을 위해 객체를 매개변수화 할때
• 각기 다른 시간의 세부화된, 큐, 실행 요청
• 되돌리기(undo) 지원
• system crash시 다시 적용시키기 위한 변경사항 로깅 지원
• 기본 연산으로 만들어진 상위레벨 연산 체계의 구조를 만들
고 싶을때. 이러한 구조중 일반적인 것으로 transaction과 같
은게 있음.
77. Behavioral Patterns
Command
Benefits
• 요청을 저장할 수 있다.
• 관련된 특정 action이나 event를 모을 수 있다.
• 다른 action을 발행하는 것이 가능하다.
• command 객체는 multiple command를 포함할 수 있다.
• 되돌리기 연산을 지원할 수 있다.
Drawbacks/consequences
• action을 담기 위한 작은 클래스들이 많이 생긴다는 단점이
있으나 큰 문제는 안 된다.
85. Behavioral Patterns
Iterator
Example
All implementations of java.util.Iterator (thus among others
also java.util.Scanner!).
All implementations of java.util.Enumeration
86. Behavioral Patterns
Iterator
Where to use
• 내부 구현을 노출하지 않고 집합 객체의 컨텐츠에 접근하려
할 때
• 집합객체의 다양한 traversal 법을 제공 하려 할 때
• 여러가지 집합 구조에 동일한 인터페이스를 제공하려 할 때
87. Behavioral Patterns
Iterator
Benefits
• 같은 iterator가 다른 aggregate에 사용될 수 있음
• 다양한 형태의 traversal 방법을 지원
• Aggregate interface를 단순화 시킴
• iteration이 일어나는 내부구조를 캡슐화
Drawbacks/consequences
• Thread safe 하지 않을 수 있음. (Memento를 이용하는 등으
로 해결 가능)
90. Behavioral Patterns
Mediator
Example
BehavioralMediator.java
java.util.Timer (all scheduleXXX() methods)
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService (the invokeXXX() and
submit() methods)
java.util.concurrent.ScheduledExecutorService (all
scheduleXXX() methods)
java.lang.reflect.Method#invoke()
91. Behavioral Patterns
Mediator
Where to use
• 객체 셋(set)이 잘 정의된 방법으로 커뮤니케이트 하나 복잡
한 방법을 사용한다.
• 객체간 레퍼런싱 한게 많고, 커뮤니케이트가 많아서 객체 재
사용이 어렵다.
• 몇몇 클래스 간의 분산된 행동들이 서브클래싱을 많이 하지
않고 커스트마이징 될 수 있어야 할 때
92. Behavioral Patterns
Mediator
Benefits
• 서브클래싱을 제한
• 동료간 커플링을 제거
• 객체 프로토콜을 단순화
• 객체의 협력 방법을 추상화
• 컨트롤을 집중시킴
Drawbacks/consequences
• 퍼포먼스 이슈를 가질 수 있음, mediator가 병목지점이 될 수
있음
102. Behavioral Patterns
Observer
Benefits
• publish와 subscriber 간 결합상태를 약하게 만듬 publisher
는 어떤, 얼마나 많은 subscriber가 존재하는지 알 필요가 없
음
Drawbacks/consequences
• 모든 subscriber에게 불필요한 정보를 전달해서 오버헤드를
야기 할 수 있음
105. Behavioral Patterns
State
Example
BehavioralState.java
All implementations of java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute() (controlled by
FacesServlet, the behaviour is dependent on current phase
(state) of JSF lifecycle)
106. Behavioral Patterns
State
Where to use
• 객체의 행동이 state에 의존적이고, state에 따라 런타임에
행동이 변경되어야만 할 때
• 연산들이 객체의 state에 의존하는 크고 많은 조건을 가질 때
107. Behavioral Patterns
State
Benefits
• 각각의 state를 클래스로 정의했을 때보다 코드가 깔끔하다
• 클래스가 상수가 아닌 state를 나타내도록 사용한다.
Drawbacks/consequences
• 작은 크기의 클래스 객체를 많이 만든다. 하지만, 프로그램이
프로세스 상에서 간결하고 명확해진다.
110. Behavioral Patterns
Strategy
Example
BehavioralStrategy.java
java.util.Comparator#compare(), executed by among others
Collections#sort().
javax.servlet.http.HttpServlet, the service() and all doXXX()
methods take HttpServletRequest and HttpServletResponse
and the implementor has to process them (and not to get
hold of them as instance variables!).
javax.servlet.Filter#doFilter()
111. Behavioral Patterns
Strategy
Where to use
• 많은 관련 클래스들이 그들의 행동만 다를 때
• 한 알고리즘의 다양한 형태가 필요할 때
• 알고리즘이 클라이언트가 모르는 데이터를 사용할때
• 한 클래스가 많은 행동을 정의하고 그들의 연산은 많은 조건
문으로 표현될때
113. Behavioral Patterns
Template Method
Definition
객체의 연산에는 알고리즘의 뼈대만 정의하고, 몇몇 단계의 구
현은 서브클래스로 미룹니다. Template Method는 알고리즘 구
조의 변경 없이 서브클래스에게 이러한 몇몇 단계의 알고리즘의
부분들을 재정의 할 수 있게 합니다.
115. Behavioral Patterns
Template Method
Example
BehavioralTemplate Method.java
All non-abstract methods of java.io.InputStream,
java.io.OutputStream, java.io.Reader and java.io.Writer.
All non-abstract methods of java.util.AbstractList,
java.util.AbstractSet and java.util.AbstractMap.
javax.servlet.http.HttpServlet, all the doXXX() methods by
default sends a HTTP 405 "Method Not Allowed" error to
the response. You're free to implement none or any of them.
116. Behavioral Patterns
Template Method
Where to use
• 알고리즘 중 변경되지 않는 부분의 구현을 하고 변경될 수 있
는 부분은 서브클래스가 구현하도록 할 때
• 코드 중복을 피하기 위해 버스클래스 간의 공통 행동을 공통
클래스안에 모아두고 싶을 때
• 서브클래스 확장을 컨트롤 하기 위해
117. Behavioral Patterns
Template Method
Benefits
• 코드 재사용
• 코드 중복 줄임
Drawbacks/consequences
• 연산이 오버라이드가 가능한지 꼭 해야 하는지 정하는 것이
중요
121. Behavioral Patterns
Visitor
Where to use
• 객체 구조가 다른 인터페이스를 가진 많은 클래스 객체를 포
함하고 있으며 실제(인터페이스가 구현된) 클래스에 맞게 이
러한 객체가 연산을 수행할 수 있게 하고 싶을 때.
• 객체 구조 내의 객체에게 다른 것과 구별되고 관련성이 없는
많은 연산이 수행될 필요가 있고, 이러한 연산들에 의해 그들
의 클래스가 오염되는 것을 피하고 싶을 때
• 객체 구조를 정의하는 클래스들은 변경이 적지만 가끔 새로
운 연산을 정의하고 싶을 때
122. Behavioral Patterns
Visitor
Benefits
• 새로운 연산을 추가하기가 쉽다.
• 관련된 연산을 모으고, 관련 없는 연산을 분리시킴
• element를 클래스 계층에 따라 접근
• state를 누적시킬 수 있음
Drawbacks/consequences
• 새로운 종류의 element class를 추가시키기 어렵다.
• 캡슐화를 깰 수 있음
123. Design Patterns
Quiz
아래 문제에서 플랫폼은 동일하다고 가정합니다. 그 외 필요한 가정은 스스로 하면 됩니다.
UML을 사용하는 경우 파일은 이미지 파일로 저장해서 주십시오. (UML을 사용할 의무는 없습니다.)
1. 오디오 플레이 라이브러리를 만들려고 합니다.
지원하는 파일 형식은 런타임에 추가, 제거 될 수 있고 별도 플러그인으로 존재합니다.
편의상 해당 플러그인은 파일 오픈, 파일 형식 디텍팅과 재생, 정지, Seek의 기능을 제공한다고 가정
합니다.
파일 형식을 디텍팅하게 되면, 음악가 정보, 제목, 섬네일을 추출해 줍니다.
플러그인은 여러 업체에서 공급하기 때문에 인터페이스가 다를 수 있다고 가정합니다.
라이브러리를 디자인하고, 어떻게 코딩할 것인지 간단히 설명하십시오.
이 라이브러리는 플러그인과 마찬가지로 파일 오픈, 파일 메타데이터, 재생, 정지, seek기능을 제공
해야 합니다.
2. 위에서 만든 플레이어 라이브러리를 가지고, 태블릿과 핸드폰에서 사용할 UI 어플을 만들려고 합
니다.
핸드폰과 태블릿 화면크기가 다른 관계로 다른 화면 구성을 가지고 있다고 가정합니다.
플레이어 라이브러리는 교육대상자 여러명이 만든것을 사용하기 때문에, 인터페이스가 같지 않을
수 있습니다.