- Today
- Total
작심삼일
7주차-1. Flyweight 본문
디자인 패턴을 모르는 사람이 스터디를 하며 적은 것이라 틀린 부분이 있을 수 있습니다.
틀린 부분은 알려주시면 감사하겠습니다.
어떤 패턴인가
공유를 통해 많은 수의 소립(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
메모리를 줄인다는 부분이 전혀 감이 오지 않았다.
하지만 포인터처럼 그 객체를 저장하는 것이 아니라, 그 객체를 특정할 수 있는 어떤 것을 저장한다고 생각하니 느낌이 오기 시작했다.
잘만 활용하면 되게 좋을 것 같지만, 막상 이 패턴의 존재를 기억하기가 어려워서 활용하기는 어려워보인다. (내 잘못)
'스터디 > 디자인 패턴' 카테고리의 다른 글
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 |