Java

[Design Pattern] 플라이급 패턴(Flyweight Pattern)

구루싸 2020. 7. 21. 22:15
반응형
SMALL

이번 학습 주제는

플라이급(Flyweight) 패턴입니다

권투에서 가장 체중이 가벼운

체급을 나타내는 플라이급!

플라이급 패턴은

오브젝트를 가볍게 하기 위한

패턴으로 가볍다는 의미는

메모리를 적게

사용하는 것을 의미입니다

다시 말하자면

인스턴스를 가능한 대로

공유시켜서 쓸데없는

인스턴스를 생성하지 않는 것입니다

그럼 플라이급 패턴의

역할들을 정리하겠습니다

역할 설명
Flyweight(플라이급) 공유하는 것이 좋은 것을 나타내는 역할
Flyweight Factory(플라이급 공장) Flyweight 역할을 만들어 인스턴스를 공유
Client(의뢰자) FlyweightFactory 역할을 사용해서 Flyweight 역할을 만들고 이용하는 역할

역할들만 보았을 때는

비교적 간단할 것 같다는

느낌이 스치네요^^

그럼 구현을 해보겠습니다

1. 클래스(Class) BigChar.java

package flyweightPattern;
import java.io.*;
public class BigChar {
	private char charname;
	private String fontdata;
	public BigChar(char charname) {
		this.charname = charname;
		try {
			BufferedReader reader = new BufferedReader(new FileReader("big" + charname + ".txt"));
			String line;
			StringBuffer buf = new StringBuffer();
			while( (line = reader.readLine()) != null) {
				buf.append(line + "\n");
			}
			reader.close();
			this.fontdata = buf.toString();
		} catch ( IOException e ) {
			this.fontdata = charname + "?";
		} 
	}
	public void print() {
		System.out.println(fontdata);
	}
}

2. 클래스(Class) BigCharFactory.java

package flyweightPattern;
import java.util.*;
public class BigCharFactory {
	private HashMap<String, BigChar> pool = new HashMap<String, BigChar>();
	private static BigCharFactory singleton = new BigCharFactory();
	private BigCharFactory() {
	}
	public static BigCharFactory getInstance() {
		return singleton;
	}
	public synchronized BigChar getBigChar(char charname) {
		BigChar bc = (BigChar)pool.get("" + charname);
		if ( bc == null ) {
			bc = new BigChar(charname);
			pool.put("" + charname, bc);
		}
		return bc;
	}
}

3. 클래스(Class) BigString.java

package flyweightPattern;

public class BigString {
	private BigChar[] bigchars;
	public BigString(String string) {
		bigchars = new BigChar[string.length()];
		BigCharFactory factory = BigCharFactory.getInstance();
		for ( int i = 0; i < bigchars.length; i++ ) {
			bigchars[i] = factory.getBigChar(string.charAt(i));			
		}
	}
	public void print() {
		for ( int i = 0; i < bigchars.length; i++ ) {
			bigchars[i].print();
		}
	}
}

4. 클래스(Class) Test.java

import flyweightPattern.*;
public class Test {
	public static void main(String[] args) {
		BigString bs = new BigString("0212123");
		bs.print();
	}
}

위의 코드의 결과는

아래의 zip 파일에 텍스트 파일을

이용하시면 보실 수 있어요~

flyweight.zip
0.00MB

싱글톤 패턴이 또 등장했네요!

혹시 싱글톤 패턴이

궁금하시다면 아래의 링크↓

2020/06/14 - [Java] - [Design Pattern] 싱글톤(Singleton) 패턴과 프로토타입(Prototype) 패턴

 

[Design Pattern] 싱글톤(Singleton) 패턴과 프로토타입(Prototype) 패턴

어느 덧 한 주를 마무리하는 일요일이 되었습니다 내일이 되면 다시 한주를 바쁘게 살아가야한다는... 아무튼 오늘은 지정한 클래스의 인스턴스가 한 개만 존재하는 것을 보증하고 싶을 때 사용

yssa.tistory.com

인스턴스를 공유하는 것이

핵심인 이 패턴에서

주의할 점은 무엇일까요?

공유하고 있는 것을

변경하면 여러 곳에

영향을 미친다는 점입니다

여기서 용어가 등장하는데

바로 intrinsic과 extrinsic입니다

intrinsic은 공유시키는 정보로서

어떠한 상황에서도 불변하고

상태에 의존하지 않습니다

반면에 extrinsic은

인스턴스를 두는 장소에 따라서

변화하는 정보로서

상황에 따라 변화하고

상태에 의존합니다

참고로 자바에서

garbage collection 기능은

관리되고 있는 인스턴스를

수집하지 않는다는 점

다시 상기하면서

오늘의 학습을 마치겠습니다

다음 학습 주제는

대리인(Proxy) 패턴입니다

그럼 이만-_-

 

 

반응형
LIST