플라이웨이트 (Flyweight) 패턴

Lee InnJie·2022년 8월 16일
0

Design Pattern

목록 보기
11/22

Flyweight 패턴

애플리케이션에서 많은 인스턴스를 생성하는 중에 사용할 수 있는 패턴이다. 인스턴스를 많이 사용하면 OutOfMemory, 즉 메모리가 부족한 현상이 발생하는데, 따로 모아서 재사용할 수 있는 패턴이다. 자주 사용하는 속성(extrinsit)과 그렇지 않은 속성(intrinsit)을 분리하여 자주 변경되지 않는 속성을 재사용한다.


Code

Flyweight의 속성은 immutable 해야 한다. 즉, 이 인스턴스의 값을 임의로 변경할 수 없다. 다른 인스턴스에도 공유되는 데이터이기 때문이다. Java에서는 final 키워드로 immutable을 유지할 수 있다.

Font

// Flyweight
public final class Font { //상속 방지
	final String family;
	final int size;
	//getter, setter, constructor
}

Charater

public class Character {
	private char value;
	private String color;
	private Font font

	//constructor
}

FontFactory

flyweight의 인스턴스에 접근하고 캐싱하는 역할을 한다.

public class FontFactory {
	private Mat<String, Font> cache = new HashMap<>();
	puboic Font getFont(String font) {
		if(cache.containKey(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;
		}
	}
}

Client

public class Clinet {
	public static void main(String[] args) {
		FontFactory fontFactory = new FontFactory();
		Character c1 = new Character("h", "white", fontFactory.getfont("namu:12"));
		//...
	}
}

장단점

장점

  • 애플리케이션에서 사용하는 메모리를 줄일 수 있다.

단점

  • 코드의 복잡도가 증가한다.

Example

도메인에서의 특정된 부분을 간추리는데 사용하는 패턴이기 때문에 라이브러리나 프레임워크에서 찾기는 쉽지 않다.

valueOf

Integer i1 = Integer.valueOf(10);

자주사용되는 값들을 캐싱해서 값을 반환한다.

profile
⌒_⌒

0개의 댓글