티스토리 뷰
플라이웨이트 패턴 (Flyweight pattern)
📝 플라이웨이트(Flyweight) 단어에서 느낄 수 있듯이 가볍다는 의미를 내포하고 있다.
플라이웨이트 패턴은 공유(Sharing)를 통해서 객체를 가볍게 만들어 메모리 사용을 줄여주는 방법을 제공하는 패턴이다.
자주 변하는 속성(extrinsit)과 변하지 않는 속성(intrinsit)을 분리하고 재 사용해 메모리 사용량을 줄일 수 있다.
객체모델
Flyweight
/**
* Flyweight 객체는 캐싱되어야 하고 공유되어야 하기 때문에 불변해야 한다. <- Kotlin의 Data Class
* 조건 1 : 불변 상태
* 조건 2 : 상속 X
*/
public record Flyweight(String name) {}
- record 는 자바 16 이후 사용가능
- record는 상속 불가, hash(), equals() 구현을 해두었으며, 불변 객체.
- 플라이웨이트 패턴은 변하지 않는 값을 풀에 캐싱해서 재사용하기 때문에 불변 객체여야 만 함.
FlyweightFactory
public class FlyweightFactory {
private Map<String, Flyweight> cache = new HashMap<>();
public Flyweight getCache(String name) {
if (cache.containsKey(name)) {
return cache.get(name);
} else {
Flyweight cachedObject = new Flyweight(name);
cache.put(name, cachedObject);
return cachedObject;
}
}
}
Client
public class Client {
static FlyweightFactory factory = new FlyweightFactory();
public static void main(String[] args) {
Flyweight hero = factory.getCache("Hero");
System.out.println(hero.name() + " -> hero1 hash : " + hero.hashCode());
Flyweight hero2 = factory.getCache("Hero");
System.out.println(hero2.name() + " -> hero2 hash : " + hero2.hashCode());
System.out.println("hero equals hero2 -> " + (hero.equals(hero2)));
}
}
결과
- 두 객체가 서로 같다는 것을 통해 재사용하고 있음을 확인 할 수 있다.
👍 장점
- 자주 사용하는 객체를 캐싱 후 재사용 하기 때문에 사용 메모리를 줄일 수 있다.
- 메모리 단편화 문제를 해결할 수 있다.
🎯 사용 예시
👉 Java의 String Constant Pool 은 생성한 String Object를 Pool에 저장해 두고 있다가 재사용 하는 방식을 가진다. 또한 String.class는 불변 객체로 만들어져 있기도 하다.
예제 코드
참조
'architecture > Design Pattern' 카테고리의 다른 글
[디자인 패턴] 책임 연쇄 패턴(CHAIN OF RESPONSIBILITY) (0) | 2022.09.25 |
---|---|
[디자인 패턴] 이터레이터 패턴(Iterator Pattern) (1) | 2022.09.24 |
[디자인 패턴] 파사드 패턴(Facade Pattern) (0) | 2022.09.23 |
[디자인 패턴] 프록시와 데코레이터 패턴 (0) | 2022.09.22 |
[디자인 패턴] Composite Pattern (0) | 2022.09.22 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- RestAssured
- Clean Architecture
- 장애 해결기
- 메모리 파편화
- 메모리 단편화
- multimap
- 정적 타입 언어
- pool
- Object Pool
- ATDD
- 내부 단편화
- 세션 불일치
- OOP
- SpringBoot 2.2
- Sticky Session
- 외부 단편화
- pass by value
- 수직 분할
- 컴포짓 패턴
- 수평 분할
- Session
- Memory Fragmentation
- 동적 타입 언어
- pass by reference
- 객체 풀
- 동적 디스패치
- 육각형 아키텍처
- 뾰족함
- 클린 아키텍처
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함