3. 이 장에서 내가 배운 것
•실체화 (Reification)
– "Design Patterns" Aren't
(http://perl.plover.com/yak/design/)
•디자인 패턴 전반에 걸쳐 반복적으로 잘못 이해되는
내용들이 있다.
•GoF의 OMT 다이어그램을 보면 마치 각 패턴에 대한 단
한가지 구현만이 있는 것으로 잘못 이해될 수 있다.
•각 패턴 마다 첨부되어 있는 구현에 대한 해설을 잘 봐야
한다.
•패턴은 다양한 구조를 가질 수 있으며, 다양하게 구현될
수 있다
•관점의 전환에 익숙해지기
4. 클래스를 읶터페이스로 대체
Class Employee {
public void youAreFired(){
//….
}
}
Client code
-----------
Employee fred = new Employee();
//…
Fred.youAreFired();
5. 클래스를 읶터페이스로 대체
Interface Employee {
void youAreFired();
}
class Employee
Class Peon implements Employee {
public void youAreFired() {
}
}
6. 클래스를 읶터페이스로 대체
모든 new
Interface Employee {
Employee() 를
void youAreFired();
} new Peon() 으로?
class Employee
Peon을 Brian로
변경하려면?
Class Peon implements Employee {
public void youAreFired() {
}
}
7. 클래스를 읶터페이스로 대체
모든 new
Interface Employee {
Employee() 를
void youAreFired();
} new Peon() 으로?
class Employee
Peon을 Brian로
변경하려면?
Class Peon implements Employee {
public void youAreFired() {
}
}
8. Factory?
•업계에서 가장 맋이 남용되는 불명확한 단어
•Factory Pattern?
– Factory Method Pattern
– Abstract Factory Pattern
– Factory Method 와 Abstract Factory 모두
– 객체를 생성하는 모든 메소드
– 하나 이상의 생성 메소드를 구현하는 클래스
(from Kerievsky)
9. Abstract Factory Pattern
•빌딩 블록 패턴
•Refactoring : 읶스턴스화 할 객체를 결정
짓는 요읶이 여러 클래스에 걸쳐서
동읷하게 나타나는 경우
•서로 연관성 있고, 상호 의졲적읶 객체들의
집단을 생성하는 것을 돕고자.
10. Abstract Factory Pattern
•클라이언트가 Concrete Class 들을
명기하지 않고 객체 집단을 생성할 수
있도록 해주려는 데 의도가 있다.
•클라이언트가 실제 객체가 정확히
무엇읶지 몰라도 객체를 생성하고 조작할
수 있다.
•클라이언트가 factory 클래스들의 객체
생성 과정을 모르게 한다는 데 있다.
16. Abstract Factory Pattern
New Employee() 를 EmployeeFactory.create() 대체
public interface Employee {
void youAreFired();
}
public static class EmployeeFactory {
private EmployeeFactory() {}
public static Employee create(){
return new Peon();
}
}
class Peon implements Employee {
public void youAreFired() {}
}
17. EmployeeFactory
* EmployeeFactory 는 Singleton 이다.
– 유일성 : 하나의 객체만을 생성
– 전역 접근 : 전역적으로 접근 가능
– 이 두 조건을 만족하면 Singleton
* Abstract Factory 와 Singleton은
자주함께 사용됨
ButtonPeer peer = Toolkit.getDefaultToolkit().createButton(b);
18. Abstract Factory Pattern
Collection : 전형적인 Abstract Factory
void g() {
Collection stuff = new LinkedList();
//
관렦된 class family 중
client(stuff);
하나를 생성하여 사용
}
void client(Collection c) {
for (iterator i = c.iterator(); c.hasNext(); ) {
doSomething(i.next());
}
}
19. Abstract Factory Pattern
AFP가 Singleton 과 합쳐 졌을 때의 맋이 나타나는 변형
public interface Employee {
Abstract void youAreFired();
Product
}
public static class EmployeeFactory {
private EmployeeFactory() {}
Concrete public static Employee create(){
Factory return new Peon();
}
}
Concrete
class Peon implements Employee {
Product public void youAreFired() {}
}
20. Abstract Factory Pattern
- 하나의 클래스(EmployeeFactory)가 여러 패턴(Abstract
Factory 와 Singleton)의 실체화 역할을 하기도 한다.
- URLConnection 의 예제 (p.125)
URL을 Concrete Factory 로 보면
URLConnection은 Abstract Product 의 역할을 한다.
InputStream을 Abstract Product로 보면
URLConnection은 Abstract Factory의 역할을 한다.
-오버랩 되어 사용되는 패턴이 있다. 관점의 젂홖에
익숙해지자. (역자)
24. Singleton Pattern
•Joshua Kerievsky 의 견해
Design Patterns 에 관렦 패턴으로 여러
차례 Singleton 패턴이 나오고 ‚어떤
패턴은 Singleton으로 구현하는 경우가
많다‛ 라는 문장을 오독하여 ‚반드시
Singleton 패턴을 사용해야 한다‛고
생각하게 됐음.
27. Singleton Pattern
•Kent Beck의 견해
Singleton에 홖젂율을 저장하는 시스템을
개발, 여러 통화를 한꺼번에 다루는 테스트
코드를 작성할 때마다 기졲의 홖젂율을
저장하고 테스트 후 복원했다.
실수 속출
28. Singleton Pattern
•Kent Beck의 견해
홖젂율 코드를 모두 찾아 파라미터를 통해
명시적으로 넘겨줬다. 맋을 것 같았지맊
재작성 할 때 30붂 정도맊 걸렸다.
•젂체 설계가 더 명확하고 유연해졌으며
•앆정적읶 테스트 코드 작성이 가능했고
•시스템 싞뢰도가 높아졌다.
30. Singleton Pattern
- 언제 쓸까?
- 시스템 성능에 대한 사용자의 불맊이 높다.
- 프로파읷러를 통해 확읶한 결과, 어떤 객체를
계속 반복해서 생성하는 것이 시스템 성능에
악영향을 미치고 있다.
- 공유하려는 객체가 상태를 갖지 않거나,
갖더라도 상태를 공유할 수 없다.
31. Singleton Pattern
•static
– ‘유읷성’과 ‘젂역 접근’을 맊족시키는 가장 쉬운 방법은
모든 것을 static 으로 선언하는 것
– 모든 것을 static 으로 하는 Singleton 실체화에서
혼동하기 쉬운 것은 객체가 없고 클래스맊 있다는
오해. (JAVA에서는 모든 클래스가 자싞의 객체를
갖는다.)
– 맋은 경우 쓰지 못함.
•정적 초기화 시점에 모든 singleton을 읶스턴스화할 정보를
갖고 있지 못할 수도 있고
•프로그램이 수행되면서 계산된 값을 요구할 수도 있다.
32. Singleton Pattern - DCL
•The dead reference problem (참조
무효화 현상) : 파괴 되었던 Singleton 을
다시 호출하는 경우
– Meyers’ singleton
– Phoenix singleton
– Singletons with Longevity
37. Singleton Pattern - DCL
Double-Checked Locking, Threads, Compiler
Optimizations, and More :
http://www.nwcpp.org/Downloads/2004/DCL
P_notes.pdf
38. Singleton Pattern - DCL
•Windows 한정
Vance Morrison의 기사 "다중 스레드 응용 프로그램에서 낮은
잠금 기술의 영향 이해(Understand the Impact of Low-Lock
Techniques in Multithreaded Apps
http://msdn.microsoft.com/msdnmag/issues/05/10/MemoryMod
els/default.aspx)"에서 관리 코드에서 발생하는 비슷한 문제에
대한 자세한 내용을 볼 수 있습니다. Visual Studio® C++
컴파일러 이전 릴리스에서는 pLogger 변수에 volatile 한정자를
사용하더라도 다중 스레드 시나리오에서 올바른 작동을 보장할
수 없었습니다.
그러나 Visual Studio 2005 릴리스에서는 pLogger 변수를
volatile 키워드로 한정하면 Windows 플랫폼에서 이중 확인 잠금
패턴을 안정적으로 실행할 수 있습니다.
39. Singleton - 죽이기
•메모리 누수? : 축적되는 데이터를
할당하고, 그에 대한 포읶터 참조를 놓쳤을
때 발생
• Singleton이라 축적이 되지는 않는다.
• 발생하더라도 대부붂의 OS에서는 프로세스 종료할 때
메모리 해제가 된다.
40. Singleton - 죽이기
•‚리소스 누수‛가 문제
– Singleton을 생성할 때 할당 받은 핸들이나
외부 커넥션 등등.
– 누수를 막기 위해서는 애플리케이션이
종료하는 시점에서 Singleton 객체를
소멸시켜야 함.
41. Singleton - 죽이기
•C++은 Destructor를 사용하면 된다지맊
•JAVA
– finalizer 는 GC가 메모리를 해제할 때맊
호출되어 시점을 알기 힘들고, 성능 문제도
있어 추천하지 않는다.
– Runtime.addShutdownHook(…) 이 있지맊
비정상 종료에는 호출되지 않는다.
42. Command Pattern
•기본 아이디어
– 무엇을, 어떻게 해야 한다는 지식을 객체에
캡슐화 하여 젂달하는 것
– 빌딩 블록 패턴
– 오퍼레이션 시그니처를 고정시키고,
클래스들이 변화하게 한다.
43. Command Pattern
class CmdObject implements Runnable {
public void run() {
//쓰레드가 실행될 때 수행하는 작업
}
};
Thread t = new Thread(new CmdObject());
t.start(); // 쓰레드 시작.
50. 참고 - 도서
•Modern C++ Design, Generic programming
and design patterns applied :
Alexandrescu Andrei
(모던 C++ 디자읶,제네릭 프로그래밍과 디자읶
패턴을 적용한)
•Agile Software Development :
Robert c. Martin
(소프트웨어 개발의 지혜)
51. 참고 - 도서
•Design Patterns Java Workbook : Steven John
Metsker
(디자읶 패턴 자바 워크북)
•Refactoring to PATTERNS : Joshua Kerievsky
(패턴을 홗용한 리팩터링)
52. 참고 - DCL
• C++ and the Perils of Double-Checked Locking :
http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
• Double-Checked Locking, Threads, Compiler Optimizations, and
More : http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf
• The "Double-Checked Locking is Broken" Declaration :
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleChecked
Locking.html
• 디자읶 패턴으로 알아본 Double Checked Lock(DCL) :
http://www.hanb.co.kr/network/view.html?bi_id=466
• Double-checked locking과 Singleton 패턴 :
http://www.ibm.com/developerworks/kr/library/j-dcl.html
• Windows Vista에 새로 추가된 동기화 기본 형식 :
http://msdn.microsoft.com/ko-kr/magazine/cc163405.aspx
• http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&p
ageno=0&wid=846&rssMode=1&wtype=0