작심삼일

7주차-1. Flyweight 본문

스터디/디자인 패턴

7주차-1. Flyweight

yun_s 2021. 6. 23. 22:03
728x90
반응형

디자인 패턴을 모르는 사람이 스터디를 하며 적은 것이라 틀린 부분이 있을 수 있습니다.

틀린 부분은 알려주시면 감사하겠습니다.

어떤 패턴인가

공유를 통해 많은 수의 소립(fine-grained) 객체들을 효과적으로 지원합니다.

 

여러 번 이용할 수 있도록 객체를 공유할 때 사용한다.

그렇기 때문에 메모리 낭비를 줄일 수 있다.


어떻게 쓰는가

그림판을 예시로 들어보면, 원을 그린다고 했을 때 원은 중심과 반지름 길이만 있으면 된다.

1번 원은 중심이 $(2, 3)$이고 반지름이 5라면 이 객체는 원[(2, 3), 5]만 가지고 있으면 된다.

class circle:
    def __init__(self, center, radius):
        self.center = center
        self.radius = radius
    
    def __repr__(self):
        return "center: "+ str(self.center) + ", radius: " + str(self.radius)
        
        
------------------------------------------------------------------
a = ('cirlce', (2, 3), 5)    # 이렇게 저장해두면 직접 객체를 만들지 않을 수 있음
b = ('circle', (4, 2), 7)
# 사용할 때 객체 생성
print(a)     # center: (2, 3), radius: 5
print(b)     # center: (4, 2), radius: 7

어디서 활용되는가

이는 책의 내용 (p. 268)을 그대로 가져왔다.

1. 응용프로그램이 대량의 객체를 사용해야할 때

    - 메모리를 많이 사용하지 않기 때문에 대량의 객체도 큰 무리없이 사용할 수 있다.

2. 대부분의 객체 상태를 부가적인 것으로 만들 수 있을 때

    - 대부분의 객체 상태가 비슷하기 때문

3. 부가적인 속성들을 제거한 후 객체들을 조사해 보니 객체의 많은 묶음이 비교적 적은 수의 공유된 객체로 대체될 수 있을 때

    - 대부분의 객체 상태가 비슷하기 때문

4. 응용프로그램이 객체의 정체성에 의존하지 않을 때

    식별자가 있다는 것은 서로 다른 객체로 구별해야 한다는 의미이므로 플라이급 객체를 사용할 수 없다.


'Strategy' 랑 ‘Flyweight’는 왜 자주 엮여서 쓰일까?

조금씩 다르지만 비슷해서 같이 쓸 수 있는 객체가 있을 때 Flyweight를 사용하는데,

이 때 조금씩 다른 부분을 Strategy를 사용하면 편하기 때문이다.


My Opinion

메모리를 줄인다는 부분이 전혀 감이 오지 않았다.

하지만 포인터처럼 그 객체를 저장하는 것이 아니라, 그 객체를 특정할 수 있는 어떤 것을 저장한다고 생각하니 느낌이 오기 시작했다.

잘만 활용하면 되게 좋을 것 같지만, 막상 이 패턴의 존재를 기억하기가 어려워서 활용하기는 어려워보인다. (내 잘못)

728x90
반응형

'스터디 > 디자인 패턴' 카테고리의 다른 글

8주차-1. Chain of responsibility  (0) 2021.07.08
7주차-2. Visitor  (0) 2021.06.23
6주차-2. Strategy  (0) 2021.06.09
6주차-1. Adapter  (0) 2021.06.09
5주차-2. State Pattern  (0) 2021.05.26
Comments