본문 바로가기

카테고리 없음

flyweight pattern

반응형

1.flyweight 정의: 가벼운것 


소프트웨어 공학에선  메모리 사용량을 말할때 많이 사용하면 무겁다라고 말하고, 적게 사용하면 가볍다고 한다.

따라서 flyweight 패턴은 메모리를 가볍게 해준다고 짐작할 수 있다. 

자바에서 인스턴스를 생성할 때는 new를 사용한다. 



2.목적 


인스턴스 생성 多 ->new 인자 多->메모리 사용량이 多 


flyweight 패턴은 메모리 사용량을 줄이기 위한 방법으로, 인스턴스를 필요한 대로 다 만들어 쓰지 말고, 동일한 것은 가능하면 공유해서 객체 생성을 줄이자는 것이다. 

  • Flyweight 패턴은 객체 공유를 통해 자원 사용량을 줄이기 위한 설계라고 할 수 있다


3.구조



flyweight 객체를 생성할때 직접적으로 flyweight 생성자를 부르는것 대신에 

factory 액세스 하고 호출된 flyweight factory 객체는 factory에 액세스 하고 flyweight 객체는 상황에 따라 아래와 같이 행동 


1.해당시점에 대상 객체가 생성되어 있는 경우 

->flyweight pool에서 조건에 맞는 객체를 리턴 

2.해당시점에 대상 객체가 생성되어있지 않는 경우 

->새로이 객체를 생성후 flyweightpool에 저장한후 리턴 


참고 블로그 https://blog.naver.com/sorkelf/220786064534

4.예제

https://blog.naver.com/ehdrhs1004/220659529736


<요약>

'공유' 

1).논리적관점의 공유(DB,파일 공유 처럼 동일한 데이터나 자원을 공유,객체를 잘사용하는 형태로만 설계 )

2).컴퓨터자원을 효율적으로 사용하기 위한 공유 (구현 관점에서 ,동일한 값이나 데이터에 대해 포인터변수등을 통해 공유 ,,

 자원 사용효율화를 위한 구현은 설계시 많은 고려를 필요로 한다.)


예>

  • 휴대폰에서 간단한 슈팅 게임 개발

    적군과 아군으로 구분, 아군은 한명인데 반해 적군은 게이머의 수준에 따라 여러 종류가 등장할 수 있고, 각 종류마다 생성되는 적군의 수도 여러명일 수 있다. 적군은 상황이나 이벤트에 따라 정해진 동작을 수행하게 되는데 이러한 동작들은 이미지 형태로 표현될 것이다.

    여기서 문제는 적군의 동작을 표현하기 위해 필요한 이미를 어떻게 관리할 것인가다. 휴대폰의 특성상 사용할 수 있는 메모리의 양이 한정되어 있기 때문에 적군의 수가 늘어난다고 하더라도 더 이상 메모리를 사용하지 못하는 문제에 부딪힐 수 있다.


논리적으로 개별 적군 객체들마다 이미지 정보를 저장, 관리하게 하는 것이 바람직하나, 이는 한정된 메모리 공간을 가진 휴대폰에 탑재될 프로그램에는 적합하지 않은 방법이라는 것이다. 따라서 우리가 해결해야 하는 문제는 어떻게 하면 논리적으로는 개별 객체들마다 이미지 정보가 저장, 관리되는 것처럼 보이면서도 실제로는 그만큼 많은 메모리를 사용하지 않고 프로그램이 동작할 수 있도록 만들어 줄 것인가 하는 것이다.


5.패턴이 유용한 경우 


  • 응용 프로그램이 많은 객체를 필요로 하는데 사용 가능한 자원이 한정되어 있을 경우
  • 많은 객체의 사용으로 저장 공간에 부담이 클 때
  • 객체의 상태 대부분이 Extrinsic State로 만들어질 수 있을 때
  • Extrinsic State 부분을 제외하고, 많은 그룹의 객체들이 상대적으로 적은 공유 객체들로 대체 가능할 때
  • 응용 프로그램이 논리적으로 객체들을 서로 구분할 필요가 없을 때

     미래에 다시동일한 객체가 나오는 패턴을 알고있어서 재사용하여 객체를 사용하고싶을때 

*여기서 공유 가능한 정보는 Flyweight 객체의 내부에 저장, 관리되기 때문에 Intrinsic State라고 하고, 공유 불가능한 정보는 Flyweight 객체 외부에 저장 관리되기 때문에 Extrinsic State라고 한다.


*Intrinsic State:공유하고자 하는 멤버 변수 

*extrinsic state: 각 클래스의 개별적인 멤버변수 


6. 장점 및 단점 

  • client 입장에서 flyweight factory 내부구조 신경쓰지 않고 사용가능 
  • 동일한 객체를 새로이 생성하는 것을 막아줌
  • 계산 가능한 객체가 많으면 많을수록 메모리 절약 
  • 객체들간의 동일성 테스트를 하지않아야한다 (서로 다름에도 동일한것으로 판단되어 문제야기)
  • 비 공유 자원을 찾거나 계산하는데 일반적인 경우보다 시간이 걸린다.

http://terms.naver.com/entry.nhn?docId=3532969&cid=58528&categoryId=58528 참고 네이버 지식백과

반응형