티스토리 뷰
플라이웨이트 패턴 (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는 불변 객체로 만들어져 있기도 하다.
예제 코드
GitHub - icraft2170/Blog-Example-Code
Contribute to icraft2170/Blog-Example-Code development by creating an account on GitHub.
github.com
참조
오브젝트 풀 (Object Pool)
오브젝트 풀 패턴 (Object Pool Pattern) Object Pool Pattern? 오브젝트 풀 패턴은 생성 디자인 패턴으로, 요청이 들어왔을 때 매번 할당및 삭제를 하는 것이 아니라 미리 만들어 둔 객체 집합 (Pool) 에서 객
internet-craft.tistory.com
코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의
디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할
www.inflearn.com
String Constant Pool이란? | Java String Pool
Java에서 String 객체를 생성하는 방법은 2가지가 있다. 첫번째는 String literal, 즉 큰 따옴표("")를 사용하는 것이고, 두번째는 new 연산자를 사용하는 것이다. 두 방법에는 어떤 차이가 있을까? 간단한
starkying.tistory.com
Spring Boot 및 Java 16 레코드
In this article, we will discuss Java 16's newest feature, Records. Then we will apply this knowledge and use it in conjunction with a Spring Boot application. 소개하다. 2021년 3월 16일, 자바16이 정식으로 발표되었습니다. 이 새로운
intrepidgeeks.com
'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
- pass by value
- 외부 단편화
- multimap
- pass by reference
- pool
- 수평 분할
- 세션 불일치
- 클린 아키텍처
- Sticky Session
- RestAssured
- 동적 디스패치
- 컴포짓 패턴
- 메모리 파편화
- Memory Fragmentation
- 동적 타입 언어
- Clean Architecture
- 메모리 단편화
- ATDD
- OOP
- Object Pool
- 육각형 아키텍처
- 내부 단편화
- 뾰족함
- java
- 객체 풀
- 장애 해결기
- Session
- SpringBoot 2.2
- 수직 분할
- 정적 타입 언어
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |