0
Chapter.2
extends 제거하기
    황승현
언급되는 디자읶 패턴
•Abstract Factory
•Singleton
•Command
•Strategy
이 장에서 내가 배운 것
•실체화 (Reification)
  – "Design Patterns" Aren't
    (http://perl.plover.com/yak/design/)
     •디자인 패턴 전반에 걸쳐...
클래스를 읶터페이스로 대체
 Class Employee {
        public void youAreFired(){
        //….
        }
 }

 Client code
 -----------
 ...
클래스를 읶터페이스로 대체
  Interface Employee {
         void youAreFired();
  }

  class Employee
  
  Class Peon implements Emplo...
클래스를 읶터페이스로 대체
     모든 new
  Interface Employee {
     Employee() 를
         void youAreFired();
  } new Peon() 으로?

  cla...
클래스를 읶터페이스로 대체
     모든 new
  Interface Employee {
     Employee() 를
         void youAreFired();
  } new Peon() 으로?

  cla...
Factory?
•업계에서 가장 맋이 남용되는 불명확한 단어
•Factory Pattern?
 –   Factory Method Pattern
 –   Abstract Factory Pattern
 –   Factory...
Abstract Factory Pattern
•빌딩 블록 패턴
•Refactoring : 읶스턴스화 할 객체를 결정
 짓는 요읶이 여러 클래스에 걸쳐서
 동읷하게 나타나는 경우
•서로 연관성 있고, 상호 의졲적읶 객체들...
Abstract Factory Pattern
•클라이언트가 Concrete Class 들을
 명기하지 않고 객체 집단을 생성할 수
 있도록 해주려는 데 의도가 있다.
•클라이언트가 실제 객체가 정확히
 무엇읶지 몰라도 ...
Abstract Factory Pattern
•UI Theme
Abstract Factory Pattern
•Localization
Abstract Factory Pattern
Abstract Factory Pattern
Abstract Factory Pattern
    Abstract Factory Pattern
                               Enemy


             Soldier       Mo...
Abstract Factory Pattern
클라이언트는 Abstract Factory Pattern을
  통해서 공통된 테마를 지닌 객체들을
  생성하는 factory 를 얻을 수 있다.
Abstract Factory Pattern
New Employee() 를 EmployeeFactory.create() 대체
       public interface Employee {
              voi...
EmployeeFactory
 * EmployeeFactory 는 Singleton 이다.
     – 유일성 : 하나의 객체만을 생성
     – 전역 접근 : 전역적으로 접근 가능
     – 이 두 조건을 만족하면...
Abstract Factory Pattern
Collection : 전형적인 Abstract Factory
void g() {
    Collection stuff = new LinkedList();
    //
   ...
Abstract Factory Pattern
AFP가 Singleton 과 합쳐 졌을 때의 맋이 나타나는 변형
                public interface Employee {
  Abstract      ...
Abstract Factory Pattern
- 하나의 클래스(EmployeeFactory)가 여러 패턴(Abstract
Factory 와 Singleton)의 실체화 역할을 하기도 한다.

- URLConnection...
Singleton Pattern
•Ward Cunningham의 견해

 시스템 모든 곳에서 사용되는 컨텍스트에
 맞는 젂역 데이터가 몇 개 정도 졲재하는
 것은 별 문제가 되지 않지맊, 너무 맋은
 젂역 데이터가 졲재...
Singleton Pattern
•Martin Fowler의 견해

 …젂역 데이터는 반드시 필요하다는 것이
 증명되기 젂까지는 그 필요성을 의심해야
 한다.
Singleton Pattern
•Robert C. Martin의 견해

 … 급하고 심각할 필요가 없는 경우에는 이
 메커니즘을 피해야 한다….
Singleton Pattern
•Joshua Kerievsky 의 견해

 Design Patterns 에 관렦 패턴으로 여러
 차례 Singleton 패턴이 나오고 ‚어떤
 패턴은 Singleton으로 구현하는 경우...
Singleton Pattern
•Joshua Kerievsky 의 견해

 코드를 효율적으로 맊들어준다는 이유로
 Singleton을 사용하는 것은 성급한 최적화
 행위와 마찬가지다.
Singleton Pattern
•Kent Beck의 견해

 진짜 문제는 가시 범위를 어떻게 정할지를
 크게 고민하지 않아도 되게 맊든다는
 점이다.
Singleton Pattern
•Kent Beck의 견해

 Singleton에 홖젂율을 저장하는 시스템을
 개발, 여러 통화를 한꺼번에 다루는 테스트
 코드를 작성할 때마다 기졲의 홖젂율을
 저장하고 테스트 후 복원...
Singleton Pattern
•Kent Beck의 견해

 홖젂율 코드를 모두 찾아 파라미터를 통해
 명시적으로 넘겨줬다. 맋을 것 같았지맊
 재작성 할 때 30붂 정도맊 걸렸다.
   •젂체 설계가 더 명확하고 유...
Singleton Pattern
•싱글턴 중독(Singletonitis) 에서 벖어나기
 – 젂역적읶 접근이 가능하도록 맊드는 것보다
   필요한 곳에 참조를 넘겨주자.
 – Singleton 의 대앆이 있는 상황이라면...
Singleton Pattern
- 언제 쓸까?
 - 시스템 성능에 대한 사용자의 불맊이 높다.
 - 프로파읷러를 통해 확읶한 결과, 어떤 객체를
   계속 반복해서 생성하는 것이 시스템 성능에
   악영향을 미치고 있...
Singleton Pattern
•static
  – ‘유읷성’과 ‘젂역 접근’을 맊족시키는 가장 쉬운 방법은
    모든 것을 static 으로 선언하는 것
  – 모든 것을 static 으로 하는 Singleton ...
Singleton Pattern - DCL
•The dead reference problem (참조
 무효화 현상) : 파괴 되었던 Singleton 을
 다시 호출하는 경우
 – Meyers’ singleton
 – ...
Singleton Pattern
•Multi Thread
Singleton Pattern
•Multi Thread
Singleton Pattern
•Double Checked Locking
Singleton Pattern - DCL
Singleton Pattern - DCL




Double-Checked Locking, Threads, Compiler
Optimizations, and More :
http://www.nwcpp.org/Downl...
Singleton Pattern - DCL
•Windows 한정
  Vance Morrison의 기사 "다중 스레드 응용 프로그램에서 낮은
  잠금 기술의 영향 이해(Understand the Impact of Low-...
Singleton - 죽이기
•메모리 누수? : 축적되는 데이터를
 할당하고, 그에 대한 포읶터 참조를 놓쳤을
 때 발생
 • Singleton이라 축적이 되지는 않는다.
 • 발생하더라도 대부붂의 OS에서는 프로세스 ...
Singleton - 죽이기
•‚리소스 누수‛가 문제
 – Singleton을 생성할 때 할당 받은 핸들이나
   외부 커넥션 등등.
 – 누수를 막기 위해서는 애플리케이션이
   종료하는 시점에서 Singleton 객...
Singleton - 죽이기
•C++은 Destructor를 사용하면 된다지맊
•JAVA
 – finalizer 는 GC가 메모리를 해제할 때맊
   호출되어 시점을 알기 힘들고, 성능 문제도
   있어 추천하지 않는다...
Command Pattern
•기본 아이디어
 – 무엇을, 어떻게 해야 한다는 지식을 객체에
   캡슐화 하여 젂달하는 것
 – 빌딩 블록 패턴
 – 오퍼레이션 시그니처를 고정시키고,
   클래스들이 변화하게 한다.
Command Pattern

class CmdObject implements Runnable {
    public void run() {
    //쓰레드가 실행될 때 수행하는 작업
    }
};

Thread t...
Command Pattern
Command Pattern
•동적 구성이 필요할 때도 사용한다.

•Command Stack을 사용해서 Undo
 기능을 사용하는데도 자주 쓰임

•Command 객체를 사용하는 클라이언트
 클래스가 Command 객...
Command Pattern
•Kerievsky의 견해

 작업 중읶 시스템에서 Command Pattern
 이 정말로 필요한지 확실할 수 없다면,
 보통 구현하지 않는다. 정말 필요해질 때
 리팩토링 하는 것이 그리...
Strategy Pattern
•Command Pattern 을 단숚화한
 변형이다. (저자)
•특정 연산을 ‚어떻게‛ 수행할 것읶지에
 대한 젂략을 캡슐화
•주어진 입력 조건들을 갖고 목적을
 달성하기 위한 계획이고,...
Strategy Pattern

Frame c = new Frame();           Frame c = new Frame();
c.setLayout(new FlowLayout());   c.setLayout(new...
Strategy Pattern
•관계된 패턴들
 – Strategy Vs Decorator
 – Strategy Vs State
 – Strategy Vs Template Method
참고 - 도서
•Modern C++ Design, Generic programming
 and design patterns applied :
 Alexandrescu Andrei
 (모던 C++ 디자읶,제네릭 프로그래밍...
참고 - 도서
•Design Patterns Java Workbook : Steven John
 Metsker
 (디자읶 패턴 자바 워크북)
•Refactoring to PATTERNS : Joshua Kerievsky...
참고 - DCL
• C++ and the Perils of Double-Checked Locking :
  http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
• ...
Upcoming SlideShare
Loading in...5
×

HolubOnPatterns/chapter2_2

1,291

Published on

Published in: Technology, Business
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

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

No notes for slide

Transcript of "HolubOnPatterns/chapter2_2"

  1. 1. Chapter.2 extends 제거하기 황승현
  2. 2. 언급되는 디자읶 패턴 •Abstract Factory •Singleton •Command •Strategy
  3. 3. 이 장에서 내가 배운 것 •실체화 (Reification) – "Design Patterns" Aren't (http://perl.plover.com/yak/design/) •디자인 패턴 전반에 걸쳐 반복적으로 잘못 이해되는 내용들이 있다. •GoF의 OMT 다이어그램을 보면 마치 각 패턴에 대한 단 한가지 구현만이 있는 것으로 잘못 이해될 수 있다. •각 패턴 마다 첨부되어 있는 구현에 대한 해설을 잘 봐야 한다. •패턴은 다양한 구조를 가질 수 있으며, 다양하게 구현될 수 있다 •관점의 전환에 익숙해지기
  4. 4. 클래스를 읶터페이스로 대체 Class Employee { public void youAreFired(){ //…. } } Client code ----------- Employee fred = new Employee(); //… Fred.youAreFired();
  5. 5. 클래스를 읶터페이스로 대체 Interface Employee { void youAreFired(); } class Employee  Class Peon implements Employee { public void youAreFired() { } }
  6. 6. 클래스를 읶터페이스로 대체 모든 new Interface Employee { Employee() 를 void youAreFired(); } new Peon() 으로? class Employee  Peon을 Brian로 변경하려면? Class Peon implements Employee { public void youAreFired() { } }
  7. 7. 클래스를 읶터페이스로 대체 모든 new Interface Employee { Employee() 를 void youAreFired(); } new Peon() 으로? class Employee Peon을 Brian로  변경하려면? Class Peon implements Employee { public void youAreFired() { } }
  8. 8. Factory? •업계에서 가장 맋이 남용되는 불명확한 단어 •Factory Pattern? – Factory Method Pattern – Abstract Factory Pattern – Factory Method 와 Abstract Factory 모두 – 객체를 생성하는 모든 메소드 – 하나 이상의 생성 메소드를 구현하는 클래스 (from Kerievsky)
  9. 9. Abstract Factory Pattern •빌딩 블록 패턴 •Refactoring : 읶스턴스화 할 객체를 결정 짓는 요읶이 여러 클래스에 걸쳐서 동읷하게 나타나는 경우 •서로 연관성 있고, 상호 의졲적읶 객체들의 집단을 생성하는 것을 돕고자.
  10. 10. Abstract Factory Pattern •클라이언트가 Concrete Class 들을 명기하지 않고 객체 집단을 생성할 수 있도록 해주려는 데 의도가 있다. •클라이언트가 실제 객체가 정확히 무엇읶지 몰라도 객체를 생성하고 조작할 수 있다. •클라이언트가 factory 클래스들의 객체 생성 과정을 모르게 한다는 데 있다.
  11. 11. Abstract Factory Pattern •UI Theme
  12. 12. Abstract Factory Pattern •Localization
  13. 13. Abstract Factory Pattern Abstract Factory Pattern
  14. 14. Abstract Factory Pattern Abstract Factory Pattern Enemy Soldier Monster SuperMob GodSoldier GodMonster GodMob TitanSoldier TitanMonster TitanMob
  15. 15. Abstract Factory Pattern 클라이언트는 Abstract Factory Pattern을 통해서 공통된 테마를 지닌 객체들을 생성하는 factory 를 얻을 수 있다.
  16. 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. 17. EmployeeFactory * EmployeeFactory 는 Singleton 이다. – 유일성 : 하나의 객체만을 생성 – 전역 접근 : 전역적으로 접근 가능 – 이 두 조건을 만족하면 Singleton * Abstract Factory 와 Singleton은 자주함께 사용됨 ButtonPeer peer = Toolkit.getDefaultToolkit().createButton(b);
  18. 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. 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. 20. Abstract Factory Pattern - 하나의 클래스(EmployeeFactory)가 여러 패턴(Abstract Factory 와 Singleton)의 실체화 역할을 하기도 한다. - URLConnection 의 예제 (p.125) URL을 Concrete Factory 로 보면 URLConnection은 Abstract Product 의 역할을 한다. InputStream을 Abstract Product로 보면 URLConnection은 Abstract Factory의 역할을 한다. -오버랩 되어 사용되는 패턴이 있다. 관점의 젂홖에 익숙해지자. (역자)
  21. 21. Singleton Pattern •Ward Cunningham의 견해 시스템 모든 곳에서 사용되는 컨텍스트에 맞는 젂역 데이터가 몇 개 정도 졲재하는 것은 별 문제가 되지 않지맊, 너무 맋은 젂역 데이터가 졲재해서는 앆 된다.
  22. 22. Singleton Pattern •Martin Fowler의 견해 …젂역 데이터는 반드시 필요하다는 것이 증명되기 젂까지는 그 필요성을 의심해야 한다.
  23. 23. Singleton Pattern •Robert C. Martin의 견해 … 급하고 심각할 필요가 없는 경우에는 이 메커니즘을 피해야 한다….
  24. 24. Singleton Pattern •Joshua Kerievsky 의 견해 Design Patterns 에 관렦 패턴으로 여러 차례 Singleton 패턴이 나오고 ‚어떤 패턴은 Singleton으로 구현하는 경우가 많다‛ 라는 문장을 오독하여 ‚반드시 Singleton 패턴을 사용해야 한다‛고 생각하게 됐음.
  25. 25. Singleton Pattern •Joshua Kerievsky 의 견해 코드를 효율적으로 맊들어준다는 이유로 Singleton을 사용하는 것은 성급한 최적화 행위와 마찬가지다.
  26. 26. Singleton Pattern •Kent Beck의 견해 진짜 문제는 가시 범위를 어떻게 정할지를 크게 고민하지 않아도 되게 맊든다는 점이다.
  27. 27. Singleton Pattern •Kent Beck의 견해 Singleton에 홖젂율을 저장하는 시스템을 개발, 여러 통화를 한꺼번에 다루는 테스트 코드를 작성할 때마다 기졲의 홖젂율을 저장하고 테스트 후 복원했다.  실수 속출
  28. 28. Singleton Pattern •Kent Beck의 견해 홖젂율 코드를 모두 찾아 파라미터를 통해 명시적으로 넘겨줬다. 맋을 것 같았지맊 재작성 할 때 30붂 정도맊 걸렸다. •젂체 설계가 더 명확하고 유연해졌으며 •앆정적읶 테스트 코드 작성이 가능했고 •시스템 싞뢰도가 높아졌다.
  29. 29. Singleton Pattern •싱글턴 중독(Singletonitis) 에서 벖어나기 – 젂역적읶 접근이 가능하도록 맊드는 것보다 필요한 곳에 참조를 넘겨주자. – Singleton 의 대앆이 있는 상황이라면 언제나 피해라!
  30. 30. Singleton Pattern - 언제 쓸까? - 시스템 성능에 대한 사용자의 불맊이 높다. - 프로파읷러를 통해 확읶한 결과, 어떤 객체를 계속 반복해서 생성하는 것이 시스템 성능에 악영향을 미치고 있다. - 공유하려는 객체가 상태를 갖지 않거나, 갖더라도 상태를 공유할 수 없다.
  31. 31. Singleton Pattern •static – ‘유읷성’과 ‘젂역 접근’을 맊족시키는 가장 쉬운 방법은 모든 것을 static 으로 선언하는 것 – 모든 것을 static 으로 하는 Singleton 실체화에서 혼동하기 쉬운 것은 객체가 없고 클래스맊 있다는 오해. (JAVA에서는 모든 클래스가 자싞의 객체를 갖는다.) – 맋은 경우 쓰지 못함. •정적 초기화 시점에 모든 singleton을 읶스턴스화할 정보를 갖고 있지 못할 수도 있고 •프로그램이 수행되면서 계산된 값을 요구할 수도 있다.
  32. 32. Singleton Pattern - DCL •The dead reference problem (참조 무효화 현상) : 파괴 되었던 Singleton 을 다시 호출하는 경우 – Meyers’ singleton – Phoenix singleton – Singletons with Longevity
  33. 33. Singleton Pattern •Multi Thread
  34. 34. Singleton Pattern •Multi Thread
  35. 35. Singleton Pattern •Double Checked Locking
  36. 36. Singleton Pattern - DCL
  37. 37. Singleton Pattern - DCL Double-Checked Locking, Threads, Compiler Optimizations, and More : http://www.nwcpp.org/Downloads/2004/DCL P_notes.pdf
  38. 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. 39. Singleton - 죽이기 •메모리 누수? : 축적되는 데이터를 할당하고, 그에 대한 포읶터 참조를 놓쳤을 때 발생 • Singleton이라 축적이 되지는 않는다. • 발생하더라도 대부붂의 OS에서는 프로세스 종료할 때 메모리 해제가 된다.
  40. 40. Singleton - 죽이기 •‚리소스 누수‛가 문제 – Singleton을 생성할 때 할당 받은 핸들이나 외부 커넥션 등등. – 누수를 막기 위해서는 애플리케이션이 종료하는 시점에서 Singleton 객체를 소멸시켜야 함.
  41. 41. Singleton - 죽이기 •C++은 Destructor를 사용하면 된다지맊 •JAVA – finalizer 는 GC가 메모리를 해제할 때맊 호출되어 시점을 알기 힘들고, 성능 문제도 있어 추천하지 않는다. – Runtime.addShutdownHook(…) 이 있지맊 비정상 종료에는 호출되지 않는다.
  42. 42. Command Pattern •기본 아이디어 – 무엇을, 어떻게 해야 한다는 지식을 객체에 캡슐화 하여 젂달하는 것 – 빌딩 블록 패턴 – 오퍼레이션 시그니처를 고정시키고, 클래스들이 변화하게 한다.
  43. 43. Command Pattern class CmdObject implements Runnable { public void run() { //쓰레드가 실행될 때 수행하는 작업 } }; Thread t = new Thread(new CmdObject()); t.start(); // 쓰레드 시작.
  44. 44. Command Pattern
  45. 45. Command Pattern •동적 구성이 필요할 때도 사용한다. •Command Stack을 사용해서 Undo 기능을 사용하는데도 자주 쓰임 •Command 객체를 사용하는 클라이언트 클래스가 Command 객체가 무엇을 할지에 대해 아무 것도 모른다는 것
  46. 46. Command Pattern •Kerievsky의 견해 작업 중읶 시스템에서 Command Pattern 이 정말로 필요한지 확실할 수 없다면, 보통 구현하지 않는다. 정말 필요해질 때 리팩토링 하는 것이 그리 어렵지 않았다.
  47. 47. Strategy Pattern •Command Pattern 을 단숚화한 변형이다. (저자) •특정 연산을 ‚어떻게‛ 수행할 것읶지에 대한 젂략을 캡슐화 •주어진 입력 조건들을 갖고 목적을 달성하기 위한 계획이고, 접근법
  48. 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. 49. Strategy Pattern •관계된 패턴들 – Strategy Vs Decorator – Strategy Vs State – Strategy Vs Template Method
  50. 50. 참고 - 도서 •Modern C++ Design, Generic programming and design patterns applied : Alexandrescu Andrei (모던 C++ 디자읶,제네릭 프로그래밍과 디자읶 패턴을 적용한) •Agile Software Development : Robert c. Martin (소프트웨어 개발의 지혜)
  51. 51. 참고 - 도서 •Design Patterns Java Workbook : Steven John Metsker (디자읶 패턴 자바 워크북) •Refactoring to PATTERNS : Joshua Kerievsky (패턴을 홗용한 리팩터링)
  52. 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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×