Flyweight

446 views
312 views

Published on

Flyweight pattern

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

  • Be the first to like this

No Downloads
Views
Total views
446
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Flyweight

  1. 1. 목차 Flyweight pattern 1. 1) 2) 3) 정의 구조 사용 예 (1) (2) C# Structural example code Real-world code - Android 개발자노트 - Java 개발자노트
  2. 2. 1. Flyweight pattern
  3. 3. 1. Flyweight pattern / 1) 정의 1. Flyweight pattern 1) 정의 (1/3) (1) 작은 크기의 객체들이 여러 개 있는 경우, 객체를 효과적으로 사용하는 방법으로 객체를 공유하게 하는 구조 입니다. (2) 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화 하는 소프트웨어 디자인 패턴입니다.
  4. 4. 1. Flyweight pattern / 1) 정의 1. Flyweight pattern 1) 정의 (2/3) A class int long char list A class B class int long char list B class int C class int long char list D class int long char long char list Memory B Memory A [그림1]. Flyweight pattern 의 효과 (일반 : Memory A , Flyweight pattern 적용 : Memory B) list C class D class
  5. 5. 1. Flyweight pattern / 1) 정의 1. Flyweight pattern 1) 정의 (3/3) - Flyweight pattern 은 유사한 클래스간의 1.오버헤드를 피하기 위해 사용되는 패턴 입니다. 데이트를 표현하기 위해 매우 많은 소규모의 클래스를 생성해야 할 때, 해당 2.인스턴스들이 일부분(일부의 3.파라미터)을 제외하고 같은 성질의 것을 같는다면 해당 변수들을 공유함으로 개별적인 2.인스턴스들의 수를 획기적으로 줄일 수 있게 되는데 Flyweight pattern 은 이런 클래스들을 관리하는 방법을 제공 합니다. - 2.인스턴스를 독보적인 존재로 만들어 주는 인스턴스의 고유한 데이터와 4.아규먼트로 전달 되는 부수적인 데이터를 참조합니다. 1. 2. 3. 4. 오버헤드 : overhead 는 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말한다. 인스턴스 : instance 는 어떤 집합에 대해서, 그 집합의 개별적인 요소. 객체 지향 프로그래밍에서, 어떤 클래스에 속하는 각 객체를 인스턴스라고 한다. 파라미터 : parameter 는 프로그램을 실행할 때 명령의 세부적인 동작을 구체적으로 지정하는 숫자나 문자를 말한다. 아규먼트 : argument 는 함수에 전달 되는 실제의 의미있는 값, 인자라는 것은 아규먼트를 뜻하는 것이다. 정확하게는 실제 전달인자(actual argument) 이다.
  6. 6. 1. Flyweight pattern / 2) 구조 1. Flyweight pattern 2) 구조 (1/3) 전체 → 부분 (집합연관관계) 독립적인 생명주기 클라이언트가 Flyweight를 요청하면 FlyweightFactory 객체는 이미 존재하는 인스턴스를 제공하거나, 만약 존재하지 않는다면 생성해야 합니다 - 모든 상태 +운영(외부 상태) +운영(외부 상태) 상속 - 고유 상태 + public - private [그림2]. Flyweight pattern 클래스 다이어그램
  7. 7. 1. Flyweight pattern / 2) 구조 1. Flyweight pattern 2) 구조 (2/3) [참여객체] ① Flyweight : Flyweight가 받아들일 수 있고, 부가적 상태에서 동작해야 하는 인터페이스를 선언하고 있습니다. 1 2 3 5 4 ② FlyweightFactory : Flyweight 객체를 생성하고 관리합니다. Flyweight 가 적절히 공유되도록 보장하며, 클라이언트가 Flyweight를 요청하면 FlyweightFactory 객체는 이미 존재하는 인스턴스를 제공하거나, 만약 존재하지 않는다면 생성해야 합니다. ③ ConcreteFlyweight : Flyweight 인터페이스를 구현하고 내부적으로 갖고 있어야 하는 본질적 상태에 대한 저장소를 정의하고 있습니다. ConcreteFlyweight 객체는 공유할 수 있는 것 이어야 하며, 그러므로 관리하는 어떤 상태라도 본질적인 것이어야 합니다. ④ UnsharedConcreteFlyweight : 모든 Flyweight 서브클래스들이 공유될 필요는 없습니다. Flyweight 인터페이스는 공유를 가능하게 하지만 그것을 강요해서는 안 되며, UnsharedConcreteFlyweight 객체가 ConcreteFlyweight 객체를 자신의 자식으로 갖는 것도 흔한 일 이라 합니다. ⑤ Client : Flyweight 에 대한 참조자를 관리하고 Flyweight의 부가적 상태를 저장합니다.
  8. 8. 1. Flyweight pattern / 2) 구조 1. Flyweight pattern 2) 구조 (3/3) [협력방법] 1. Flyweight 클래스가 기능을 수행하는 데 필요한 상태가 본질적인 것인지 부가적인 것인지를 구분해야 합니다. 2. 본질적 상태는 ConcreteFlyweight 클래스에 저장해야 하고 부가적인 상태는 클라이언트 객체에 의해 저장되거나 연산되어야 하는 다른 상태로 관리해야 합니다. 3. 클라이언트는 오퍼레이션을 호출할 때 자신에게만 필요한 부가적 상태를 담고 있는 객체를 Flyweight 클래스에게 파라미터로 전달해야 합니다. 4. 클라이언트는 ConcreteFlyweight 클래스의 인스턴스를 직접 만들 수 없음으로, ConcreteFlyweight 객체를 Factory 객체로부터 얻어(공유)야 합니다.
  9. 9. 1. Flyweight pattern / 3) 사용 예 / (1) C# Structural example code 1. Flyweight pattern 3) 사용 예 (1) C# Structural example code (1~3p) 이 예제코드는 개체의 수가 상대적으로 적지 만, 다른 클라이언트에 의해 많은 시간 공유되는 플라이 패턴을 보여줍니다. -1-
  10. 10. 1. Flyweight pattern / 3) 사용 예 / (1) C# Structural example code 1. Flyweight pattern -2-
  11. 11. 1. Flyweight pattern / 3) 사용 예 / (1) C# Structural example code 1. Flyweight pattern -3-
  12. 12. 1. Flyweight pattern / 3) 사용 예 / (1) C# Structural example code 1. Flyweight pattern -4-
  13. 13. 1. Flyweight pattern / 3) 사용 예 / (2) Real-world code – Android 개발자 노트 1. Flyweight pattern 3) 사용 예 (2) Real-world code – Android 개발자 노트 안드로이드 개발을 진행하면서, ListView를 활용한 이미지 프로세싱에 대해서 현재 페이스북 Graph api 와 FQL을 가지고, 이미지관련 작업으로 Show를 하고 있는 중이다. 구현은 잘되는데, 사용자 경험(ux)측면에서 퍼포먼스가 너무 느리고, 거기에다가 outOfMemoryError 라는 지금까지 안드로이드 개발하면서 처음 아주 신선한 경험을 하고 있는데, Flyweight pattern을 사용하여 이를 해결했다. 해당 패턴은 인스턴트(new 로 생성된)를 공유하여 메모리 소비를 적게한다는데 그 로직이 있다...(이하 생략) http://twoday.tistory.com/29 출처 -1-
  14. 14. 1. Flyweight pattern / 3) 사용 예 / (2) Real-world code – Android 개발자 노트 1. Flyweight pattern ...(이전생략) 제네릭에 기초를 해서 하드코딩 해봣습니다. pool에 인스턴스를 종류별로 만들고, 같은 값을 사용하는 인스턴스를 Key 값으로 분류해 사용하면, 매번 new 하지 않아도 되고(new 를 할때 시간소요), 그만큼 메모리도 덜 소비 해서 퍼포먼스를 높일 수 있습니다. 또 한가지, 기본적인 사항인데, garbage collection 입니다. 자바는 가비지 컬랙터로 메모리를 자동 관리 해주는데, 자동적으로 garbage(쓰레기)를 치울 수 있도록 하기 위해 해당 인스턴스의 레퍼런스 카운트 (참조가 된 숫자)를 0으로 만들어 주면 된다고 배웠습니다. 좌측의 HashMap을 사용할때에 굉장히 중요한 것 같습니다. Map자체가 List이고 그 안에 저장되는 V값은 인스턴스인데 리소스를 엄청 잡아 먹습니다. 따라서 outOfMemoryError을 겪지 않기위해 사용 후 HashMap의 엔트리를 삭제(레퍼런스 카운트들 을 0으로)해줍니다. http://twoday.tistory.com/29 출처 -2-
  15. 15. 1. Flyweight pattern / 3) 사용 예 / (2) Real-world code – Java 개발자 노트 1. Flyweight pattern 3) 사용 예 (2) Real-world code – Java 개발자노트 테스트 코드에서 p1과 p3는 둘다 "홍길동"이란 String을 이용해서 객체를 주문합니다. 같은 String으로 객체를 주문했으므로 같은 객체가 리턴됩니다. 두번째 요청에서는 새로 생성하지 않습니다. -1- http://iilii.egloos.com/4066794 출처
  16. 16. 1. Flyweight pattern / 3) 사용 예 / (2) Real-world code – Java 개발자 노트 1. Flyweight pattern 일반적으로 immutable 타입만을 멤버 변수로 가지고 어떤 메쏘드를 제공하는 경우에도 flyweight를 사용합니다. Servlet 이 그 대표적인 예입니다. 하나의 servlet에 여러 쓰레드가 동시에 접근할 수 있습니다. 하지만, 이 요청들을 처리 하는 것은 하나의 인스턴스 입니다. javax.servlet.Servlet 인터페이스를 기준으 로 보면, service 메쏘드는 여러 쓰레드에서 동시에 실행시킬 수 있습니다. 따라서 보통 Servlet의 경우는 멤버 변수에 의존하는 로직을 만들면 안 됩니다. 아주 미세한 시간 차이로 꼬일 수 있습니다. 사용자 정보를 출력하는 Servlet의 경우 사용자 정보를 Servlet에 저장하게 되면, 다른 사용자가 그 Servlet에 접근 했을 때 보여질 수도 있습니다. Flyweight 클래스(여기서는 Person)은 가능하면 생성자를 외부로 공개하지 않는 것이 좋습니다. 첫째는 앞에서 사용한 것처럼 Flyweight Factory에서 내부 클래스로 가지고 있으면서 생성자를 외부로 공개하지 않는 방법입니다. 두번째는 Flyweight의 클래스 선언은 public으로 생성자는 default(packageprivae 또는 friendly 라고도 합니다. 접근자를 선언하지 않는 거죠) 로 선언하고, Flyweight Factory 클래스를 같은 패키지 안에 넣는 방법입니다. http://iilii.egloos.com/4066794 출처 -2-
  17. 17. Q&A

×