이번 학습 주제는
플라이급(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 파일에 텍스트 파일을
이용하시면 보실 수 있어요~
싱글톤 패턴이 또 등장했네요!
혹시 싱글톤 패턴이
궁금하시다면 아래의 링크↓↓
2020/06/14 - [Java] - [Design Pattern] 싱글톤(Singleton) 패턴과 프로토타입(Prototype) 패턴
인스턴스를 공유하는 것이
핵심인 이 패턴에서
주의할 점은 무엇일까요?
공유하고 있는 것을
변경하면 여러 곳에
영향을 미친다는 점입니다
여기서 용어가 등장하는데
바로 intrinsic과 extrinsic입니다
intrinsic은 공유시키는 정보로서
어떠한 상황에서도 불변하고
상태에 의존하지 않습니다
반면에 extrinsic은
인스턴스를 두는 장소에 따라서
변화하는 정보로서
상황에 따라 변화하고
상태에 의존합니다
참고로 자바에서
garbage collection 기능은
관리되고 있는 인스턴스를
수집하지 않는다는 점
다시 상기하면서
오늘의 학습을 마치겠습니다
다음 학습 주제는
대리인(Proxy) 패턴입니다
그럼 이만-_-
'Java' 카테고리의 다른 글
[Design Pattern] 명령 패턴(Command Pattern)과 통역 패턴(Interpreter Pattern) (0) | 2020.07.24 |
---|---|
[Design Pattern] 대리인 패턴(Proxy Pattern) (0) | 2020.07.22 |
[Design Pattern] 상태 패턴(State Pattern) (0) | 2020.07.20 |
[Design Pattern] 추억거리 패턴(Memento Pattern) (0) | 2020.07.16 |
[Design Pattern] 관찰자 패턴(Observer Pattern) (0) | 2020.07.15 |