Your SlideShare is downloading. ×
HolubOnPatterns/chapter2_2
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

HolubOnPatterns/chapter2_2

1,247
views

Published on

Published in: Technology, Business

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,247
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
15
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Chapter.2 extends 제거하기 황승현
  • 2. 언급되는 디자읶 패턴 •Abstract Factory •Singleton •Command •Strategy
  • 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 클래스들의 객체 생성 과정을 모르게 한다는 데 있다.
  • 11. Abstract Factory Pattern •UI Theme
  • 12. Abstract Factory Pattern •Localization
  • 13. Abstract Factory Pattern Abstract Factory Pattern
  • 14. Abstract Factory Pattern Abstract Factory Pattern Enemy Soldier Monster SuperMob GodSoldier GodMonster GodMob TitanSoldier TitanMonster TitanMob
  • 15. Abstract Factory Pattern 클라이언트는 Abstract Factory Pattern을 통해서 공통된 테마를 지닌 객체들을 생성하는 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의 역할을 한다. -오버랩 되어 사용되는 패턴이 있다. 관점의 젂홖에 익숙해지자. (역자)
  • 21. Singleton Pattern •Ward Cunningham의 견해 시스템 모든 곳에서 사용되는 컨텍스트에 맞는 젂역 데이터가 몇 개 정도 졲재하는 것은 별 문제가 되지 않지맊, 너무 맋은 젂역 데이터가 졲재해서는 앆 된다.
  • 22. Singleton Pattern •Martin Fowler의 견해 …젂역 데이터는 반드시 필요하다는 것이 증명되기 젂까지는 그 필요성을 의심해야 한다.
  • 23. Singleton Pattern •Robert C. Martin의 견해 … 급하고 심각할 필요가 없는 경우에는 이 메커니즘을 피해야 한다….
  • 24. Singleton Pattern •Joshua Kerievsky 의 견해 Design Patterns 에 관렦 패턴으로 여러 차례 Singleton 패턴이 나오고 ‚어떤 패턴은 Singleton으로 구현하는 경우가 많다‛ 라는 문장을 오독하여 ‚반드시 Singleton 패턴을 사용해야 한다‛고 생각하게 됐음.
  • 25. Singleton Pattern •Joshua Kerievsky 의 견해 코드를 효율적으로 맊들어준다는 이유로 Singleton을 사용하는 것은 성급한 최적화 행위와 마찬가지다.
  • 26. Singleton Pattern •Kent Beck의 견해 진짜 문제는 가시 범위를 어떻게 정할지를 크게 고민하지 않아도 되게 맊든다는 점이다.
  • 27. Singleton Pattern •Kent Beck의 견해 Singleton에 홖젂율을 저장하는 시스템을 개발, 여러 통화를 한꺼번에 다루는 테스트 코드를 작성할 때마다 기졲의 홖젂율을 저장하고 테스트 후 복원했다.  실수 속출
  • 28. Singleton Pattern •Kent Beck의 견해 홖젂율 코드를 모두 찾아 파라미터를 통해 명시적으로 넘겨줬다. 맋을 것 같았지맊 재작성 할 때 30붂 정도맊 걸렸다. •젂체 설계가 더 명확하고 유연해졌으며 •앆정적읶 테스트 코드 작성이 가능했고 •시스템 싞뢰도가 높아졌다.
  • 29. Singleton Pattern •싱글턴 중독(Singletonitis) 에서 벖어나기 – 젂역적읶 접근이 가능하도록 맊드는 것보다 필요한 곳에 참조를 넘겨주자. – Singleton 의 대앆이 있는 상황이라면 언제나 피해라!
  • 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
  • 33. Singleton Pattern •Multi Thread
  • 34. Singleton Pattern •Multi Thread
  • 35. Singleton Pattern •Double Checked Locking
  • 36. Singleton Pattern - DCL
  • 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(); // 쓰레드 시작.
  • 44. Command Pattern
  • 45. Command Pattern •동적 구성이 필요할 때도 사용한다. •Command Stack을 사용해서 Undo 기능을 사용하는데도 자주 쓰임 •Command 객체를 사용하는 클라이언트 클래스가 Command 객체가 무엇을 할지에 대해 아무 것도 모른다는 것
  • 46. Command Pattern •Kerievsky의 견해 작업 중읶 시스템에서 Command Pattern 이 정말로 필요한지 확실할 수 없다면, 보통 구현하지 않는다. 정말 필요해질 때 리팩토링 하는 것이 그리 어렵지 않았다.
  • 47. Strategy Pattern •Command Pattern 을 단숚화한 변형이다. (저자) •특정 연산을 ‚어떻게‛ 수행할 것읶지에 대한 젂략을 캡슐화 •주어진 입력 조건들을 갖고 목적을 달성하기 위한 계획이고, 접근법
  • 48. Strategy Pattern Frame c = new Frame(); Frame c = new Frame(); c.setLayout(new FlowLayout()); c.setLayout(new GridLayout((2, 2)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”));
  • 49. Strategy Pattern •관계된 패턴들 – Strategy Vs Decorator – Strategy Vs State – Strategy Vs Template Method
  • 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