- 자바(JAVA) - 플라이 웨이트(Flyweight) 패턴
1. 의도
동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유해서 사용하도록 하여 메모리 사용량을 최소화하는 소프트웨어 디자인 패턴
2. 용도
주로 메모리 사용량을 줄여서 효율성을 높일 때 사용
3. UML
4. 구현
public class Font {
final String family;
final int size;
public Font(String family, int size) {
this.family = family;
this.size = size;
}
}
=========================================================================
public class FontFactory {
private final Map<String, Font> cache = new HashMap<>();
public Font getFont(String font) {
if (cache.containsKey(font)) {
return cache.get(font);
} else {
String[] split = font.split(":");
Font newFont = new Font(split[0], Integer.parseInt(split[1]));
cache.put(font, newFont);
return newFont;
}
}
}
=========================================================================
public class Character {
private final char value;
private final String color;
private final Font font;
public Character(char value, String color, Font font) {
this.value = value;
this.color = color;
this.font = font;
}
// 비교를 위해 만듬
public Character(char value, String color, String fontFamily, int fontSize) {
this.value = value;
this.color = color;
this.font = new Font(fontFamily, fontSize);
}
public Font getFont() {
return font;
}
}
=========================================================================
public class Client {
public static void main(String[] args) {
FontFactory fontFactory = new FontFactory();
Character c1 = new Character('h', "white", fontFactory.getFont("nanum:12"));
Character c2 = new Character('e', "white", fontFactory.getFont("nanum:12"));
Character c3 = new Character('i', "white", fontFactory.getFont("nanum:12"));
System.out.println(c1.getFont());
System.out.println(c2.getFont());
System.out.println(c3.getFont());
Character c4 = new Character('h', "white", "nanum", 12);
Character c5 = new Character('h', "white", "nanum", 12);
Character c6 = new Character('h', "white", "nanum", 12);
System.out.println(c4.getFont());
System.out.println(c5.getFont());
System.out.println(c6.getFont());
}
}
//결과
/*
c1 : org.example.flyweight.Font@59f95c5d
c2 : org.example.flyweight.Font@59f95c5d
c3 : org.example.flyweight.Font@59f95c5d
c4 : org.example.flyweight.Font@5c8da962
c5 : org.example.flyweight.Font@512ddf17
c6 : org.example.flyweight.Font@2c13da15
*/
재사용하는 것을 볼 수 있다.
5. 패턴의 장단점
- 장점
- 애플리케이션에서 사용하는 유사한 객체들이 많은 경우 메모리 사용량을 줄일 수 있다.
- 단점
- 특정 인스턴스만 다른 인스턴스처럼 동작하도록 하는 것이 불가능
- 객체의 값을 변경하면 공유받은 객체를 사용하는 곳에 영향을 줄 수 있다.
출처 :
https://refactoring.guru/design-patterns/flyweight
Flyweight
/ Design Patterns / Structural Patterns Flyweight Also known as: Cache Intent Flyweight is a structural design pattern that lets you fit more objects into the available amount of RAM by sharing common parts of state between multiple objects instead of keep
refactoring.guru
'디자인 패턴' 카테고리의 다른 글
자바(JAVA) - 어댑터(Adapter) 패턴 (1) | 2023.11.21 |
---|---|
자바(JAVA) - 프로토타입(Prototype) 패턴 (5) | 2023.11.20 |
자바(JAVA) - 팩토리 메서드(Factory Method) 패턴 (0) | 2023.11.15 |
자바(JAVA) - 추상팩토리(Abstract Factory) 패턴 (2) | 2023.11.08 |
자바(JAVA) - 컴포지트(Composite) 패턴 (0) | 2023.11.02 |