Java & Kotlin/Java
[Design Pattern] Flyweight Pattern
전봉근
2020. 1. 12. 12:19
반응형
플라이웨이트 패턴(Flyweight Pattern)
플라이웨이트 패턴을 통하여 메모리 공간
을 절약할 수 있다.
Client가 Flyweight를 직접관리하지 않고 Factory나 다른 매니저들한테 Flyweight를 대신 관리하도록 하는것이 해당 패턴의 중요한 부분이다.
플라이웨이트 패턴 예시 - 1
먼저 Client가 다루는 Flyweight 클래스를 생성하자.
[Flyweight.java]
package com.bkjeon.flyweight;
public class Flyweight {
public Flyweight(String data) {
this.data = data;
}
private String data;
public String getData() {
return data;
}
}
FlyweightFactory(=매니저) 클래스를 생성하자.
[FlyweightFactory.java]
package com.bkjeon.flyweight;
import java.util.Map;
import java.util.TreeMap;
public class FlyweightFactory {
Map<String, Flyweight> pool;
public FlyweightFactory() {
pool = new TreeMap<>();
}
public Flyweight getFlyweight(String key) {
Flyweight flyweight = pool.get(key);
if (flyweight == null) {
flyweight = new Flyweight(key);
pool.put(key, flyweight); // pool에 넣어주는 부분이 없다면 계속하여 새로생성하여 메모리에 치명적
System.out.println("새로생성 " + key);
} else {
System.out.println("재사용 " + key);
}
return flyweight;
}
}
메인 클래스를 작성
[Main.java]
package com.bkjeon.flyweight;
public class Main {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight flyweight = factory.getFlyweight("A");
System.out.println(flyweight);
flyweight = factory.getFlyweight("A");
System.out.println(flyweight);
flyweight = factory.getFlyweight("A");
System.out.println(flyweight);
flyweight = factory.getFlyweight("A");
System.out.println(flyweight);
// 새로생성
// flyweight = factory.getFlyweight("B");
// System.out.println(flyweight);
}
}
실행결과
새로생성 A
com.bkjeon.flyweight.Flyweight@4f3f5b24
재사용 A
com.bkjeon.flyweight.Flyweight@4f3f5b24
재사용 A
com.bkjeon.flyweight.Flyweight@4f3f5b24
처음에만 새로 생성하고 그 다음부터 재사용 하므로 메모리를 적게 사용할 수 있는 장점이 있다.
반응형