SlideShare a Scribd company logo
1 of 18
목차

Flyweight pattern

1.
1)
2)
3)

정의
구조
사용 예
(1)
(2)

C# Structural example code
Real-world code
- Android 개발자노트
- Java 개발자노트
1. Flyweight pattern
1. Flyweight pattern / 1) 정의

1. Flyweight pattern
1) 정의 (1/3)
(1) 작은 크기의 객체들이 여러 개 있는 경우, 객체를 효과적으로 사용하는
방법으로 객체를 공유하게 하는 구조 입니다.
(2) 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을
최소화 하는 소프트웨어 디자인 패턴입니다.
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
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) 이다.
1. Flyweight pattern / 2) 구조

1. Flyweight pattern
2) 구조 (1/3)
전체 → 부분
(집합연관관계)
독립적인 생명주기
클라이언트가 Flyweight를 요청하면
FlyweightFactory 객체는 이미 존재하는
인스턴스를 제공하거나, 만약 존재하지
않는다면 생성해야 합니다

- 모든 상태
+운영(외부 상태)

+운영(외부 상태)

상속

- 고유 상태

+ public
- private

[그림2]. Flyweight pattern 클래스 다이어그램
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의 부가적 상태를 저장합니다.
1. Flyweight pattern / 2) 구조

1. Flyweight pattern
2) 구조 (3/3)

[협력방법]
1. Flyweight 클래스가 기능을 수행하는 데 필요한 상태가
본질적인 것인지 부가적인 것인지를 구분해야 합니다.
2. 본질적 상태는 ConcreteFlyweight 클래스에 저장해야 하고
부가적인 상태는 클라이언트 객체에 의해 저장되거나
연산되어야 하는 다른 상태로 관리해야 합니다.
3. 클라이언트는 오퍼레이션을 호출할 때 자신에게만 필요한
부가적 상태를 담고 있는 객체를 Flyweight 클래스에게
파라미터로 전달해야 합니다.

4. 클라이언트는 ConcreteFlyweight 클래스의 인스턴스를 직접 만들 수 없음으로, ConcreteFlyweight 객체를
Factory 객체로부터 얻어(공유)야 합니다.
1. Flyweight pattern / 3) 사용 예 / (1) C# Structural
example code

1. Flyweight pattern
3) 사용 예
(1) C# Structural example code (1~3p)
이 예제코드는 개체의 수가 상대적으로 적지 만, 다른 클라이언트에
의해 많은 시간 공유되는 플라이 패턴을 보여줍니다.

-1-
1. Flyweight pattern / 3) 사용 예 / (1) C# Structural
example code

1. Flyweight pattern

-2-
1. Flyweight pattern / 3) 사용 예 / (1) C# Structural
example code

1. Flyweight pattern

-3-
1. Flyweight pattern / 3) 사용 예 / (1) C# Structural
example code

1. Flyweight pattern

-4-
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-
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-
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 출처
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-
Q&A

More Related Content

What's hot

Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinDong Chan Shin
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
 
C++ Advanced 강의 5주차
C++ Advanced 강의 5주차C++ Advanced 강의 5주차
C++ Advanced 강의 5주차HyunJoon Park
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터Dong Chan Shin
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부quxn6
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinDong Chan Shin
 
Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Dong Chan Shin
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디quxn6
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
C++ Advanced 강의 4주차
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차HyunJoon Park
 
C++ Advanced 강의 1주차
C++ Advanced 강의 1주차C++ Advanced 강의 1주차
C++ Advanced 강의 1주차HyunJoon Park
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2현찬 양
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
C++’s move semantics
C++’s move semanticsC++’s move semantics
C++’s move semanticsLusain Kim
 
Javascript introduction, dynamic data type, operator
Javascript introduction, dynamic data type, operatorJavascript introduction, dynamic data type, operator
Javascript introduction, dynamic data type, operatorYoung-Beom Rhee
 

What's hot (20)

Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
C++ Advanced 강의 5주차
C++ Advanced 강의 5주차C++ Advanced 강의 5주차
C++ Advanced 강의 5주차
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
 
Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
C++ api design 품질
C++ api design 품질C++ api design 품질
C++ api design 품질
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디
 
Mec 56
Mec 56Mec 56
Mec 56
 
5 6 1
5 6 15 6 1
5 6 1
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
C++ Advanced 강의 4주차
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차
 
C++ Advanced 강의 1주차
C++ Advanced 강의 1주차C++ Advanced 강의 1주차
C++ Advanced 강의 1주차
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
C++’s move semantics
C++’s move semanticsC++’s move semantics
C++’s move semantics
 
Javascript introduction, dynamic data type, operator
Javascript introduction, dynamic data type, operatorJavascript introduction, dynamic data type, operator
Javascript introduction, dynamic data type, operator
 

Similar to Flyweight

Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4Daniel Lim
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2SeungHyun Hwang
 
Java 강의자료 ed11
Java 강의자료 ed11Java 강의자료 ed11
Java 강의자료 ed11hungrok
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js functionYoung-Beom Rhee
 
Programming java day2
Programming java day2Programming java day2
Programming java day2Jaehoonyam
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴Jaeho Seok
 
More Effective C++ 4주차
More Effective C++ 4주차More Effective C++ 4주차
More Effective C++ 4주차Injae Lee
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeYoung-Beom Rhee
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장SeongHyun Ahn
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나Astin Choi
 

Similar to Flyweight (20)

Rust
RustRust
Rust
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2
 
Java script
Java scriptJava script
Java script
 
Java 강의자료 ed11
Java 강의자료 ed11Java 강의자료 ed11
Java 강의자료 ed11
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function
 
Programming java day2
Programming java day2Programming java day2
Programming java day2
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴
 
More Effective C++ 4주차
More Effective C++ 4주차More Effective C++ 4주차
More Effective C++ 4주차
 
Bridge
BridgeBridge
Bridge
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
 
7 8 1
7 8 17 8 1
7 8 1
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
Clojure Chapter.6
Clojure Chapter.6Clojure Chapter.6
Clojure Chapter.6
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나
 

Flyweight

  • 1.
  • 2. 목차 Flyweight pattern 1. 1) 2) 3) 정의 구조 사용 예 (1) (2) C# Structural example code Real-world code - Android 개발자노트 - Java 개발자노트
  • 4. 1. Flyweight pattern / 1) 정의 1. Flyweight pattern 1) 정의 (1/3) (1) 작은 크기의 객체들이 여러 개 있는 경우, 객체를 효과적으로 사용하는 방법으로 객체를 공유하게 하는 구조 입니다. (2) 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화 하는 소프트웨어 디자인 패턴입니다.
  • 5. 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
  • 6. 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) 이다.
  • 7. 1. Flyweight pattern / 2) 구조 1. Flyweight pattern 2) 구조 (1/3) 전체 → 부분 (집합연관관계) 독립적인 생명주기 클라이언트가 Flyweight를 요청하면 FlyweightFactory 객체는 이미 존재하는 인스턴스를 제공하거나, 만약 존재하지 않는다면 생성해야 합니다 - 모든 상태 +운영(외부 상태) +운영(외부 상태) 상속 - 고유 상태 + public - private [그림2]. Flyweight pattern 클래스 다이어그램
  • 8. 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의 부가적 상태를 저장합니다.
  • 9. 1. Flyweight pattern / 2) 구조 1. Flyweight pattern 2) 구조 (3/3) [협력방법] 1. Flyweight 클래스가 기능을 수행하는 데 필요한 상태가 본질적인 것인지 부가적인 것인지를 구분해야 합니다. 2. 본질적 상태는 ConcreteFlyweight 클래스에 저장해야 하고 부가적인 상태는 클라이언트 객체에 의해 저장되거나 연산되어야 하는 다른 상태로 관리해야 합니다. 3. 클라이언트는 오퍼레이션을 호출할 때 자신에게만 필요한 부가적 상태를 담고 있는 객체를 Flyweight 클래스에게 파라미터로 전달해야 합니다. 4. 클라이언트는 ConcreteFlyweight 클래스의 인스턴스를 직접 만들 수 없음으로, ConcreteFlyweight 객체를 Factory 객체로부터 얻어(공유)야 합니다.
  • 10. 1. Flyweight pattern / 3) 사용 예 / (1) C# Structural example code 1. Flyweight pattern 3) 사용 예 (1) C# Structural example code (1~3p) 이 예제코드는 개체의 수가 상대적으로 적지 만, 다른 클라이언트에 의해 많은 시간 공유되는 플라이 패턴을 보여줍니다. -1-
  • 11. 1. Flyweight pattern / 3) 사용 예 / (1) C# Structural example code 1. Flyweight pattern -2-
  • 12. 1. Flyweight pattern / 3) 사용 예 / (1) C# Structural example code 1. Flyweight pattern -3-
  • 13. 1. Flyweight pattern / 3) 사용 예 / (1) C# Structural example code 1. Flyweight pattern -4-
  • 14. 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-
  • 15. 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-
  • 16. 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 출처
  • 17. 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-
  • 18. Q&A