1) 의미
객체를 가볍게 하기 위한 패턴 메모리를
좀더 적게 사용하여 객체를 표현하는 방법을 다룹니다.
2. 소스
1) txt 파일로 0~9까지 큰 숫자를 작성합니다.
2) 숫자를 char로 받아서 해당 txt 파일을 확인하는 BigChar 클래스를
작성합니다.
package a;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BigChar {
// 문자의 이름
private char charname;
// 큰 문자를 표현하는 문자열('#' '.' '\n'의 열)
private String fontdata;
// 생성자
public BigChar(char charname) {
this.charname = charname;
try {
//System.out.println("big"+charname +".txt");
BufferedReader reader = new BufferedReader(
new FileReader("big" + charname + ".txt")
);
String line;
StringBuffer buf = new StringBuffer();
while ((line = reader.readLine()) != null) {
buf.append(line);
buf.append("\n");
}
reader.close();
this.fontdata = buf.toString();
} catch (IOException e) {
this.fontdata = charname + "?";
}
}
// 큰 문자를 표시한다.
public void print() {
System.out.print(fontdata);
}
}
3) BigCharFactory 클래스를 작성합니다. 이 클래스는
bigchar 클래스의 인스턴스를 공유, 및 생성합니다.
package a;
import java.util.Hashtable;
public class BigCharFactory {
// 이미 만들어진 BigChar의 인스턴스를 관리
private Hashtable pool = new Hashtable();
// Singleton 패턴
private static BigCharFactory singleton = new BigCharFactory();
// 생성자
private BigCharFactory() {
}
// 유일한 하나의 인스턴스를 얻는다.
public static BigCharFactory getInstance() {
return singleton;
}
// BigChar의 인스턴스 생성(공유)
public synchronized BigChar getBigChar(char charname) {
BigChar bc = (BigChar)pool.get("" + charname);
if (bc == null) {
bc = new BigChar(charname); // 여기에서 BigChar의 인스턴스를 생성
pool.put("" + charname, bc);
}
return bc;
}
}
4) BigString 클래스에서는 큰 숫자 인스턴스를 이용해
화면에 뿌려줍니다.
package a;
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();
}
}
}
bigchar 클래스의 인스턴스를 공유, 및 생성합니다.
package a;
import java.util.Hashtable;
public class BigCharFactory {
// 이미 만들어진 BigChar의 인스턴스를 관리
private Hashtable pool = new Hashtable();
// Singleton 패턴
private static BigCharFactory singleton = new BigCharFactory();
// 생성자
private BigCharFactory() {
}
// 유일한 하나의 인스턴스를 얻는다.
public static BigCharFactory getInstance() {
return singleton;
}
// BigChar의 인스턴스 생성(공유)
public synchronized BigChar getBigChar(char charname) {
BigChar bc = (BigChar)pool.get("" + charname);
if (bc == null) {
bc = new BigChar(charname); // 여기에서 BigChar의 인스턴스를 생성
pool.put("" + charname, bc);
}
return bc;
}
}
4) BigString 클래스에서는 큰 숫자 인스턴스를 이용해
화면에 뿌려줍니다.
package a;
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();
}
}
}
5) 테스트 를 위한 클래스입니다.
argument 에 숫자를 넣으면 결과에 큰숫자를 보여주게끔
작성합니다.
package a;
public class Main {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("Usage: java Main digits");
System.out.println("Example: java Main 1212123");
System.exit(0);
}
BigString bs = new BigString(args[0]);
bs.print();
}
}
결과 : (블로그라 좀 찌그러져 보입니다.
....######....
....##......##....
...............##....
.........####.....
...............##.....
....##......##....
....######....
.........................
....######....
....##......##....
...............##....
.........####.....
...............##.....
....##......##....
....######....
.........................
3. 다이어그램
https://ko.wikipedia.org/wiki/%ED%94%8C%EB%9D%BC%EC%9D%B4%EC%9B%A8%EC%9D%B4%ED%8A%B8_%ED%8C%A8%ED%84%B44. 관련패턴
1) Proxy 패턴
인스턴스 생성에 시간이 거리는 경우 인스턴스를 공유하여
처리 속도를 향상시킬 수 있습니다.
Proxy 에서는 대리인을 내세워 처리 속도를 올립니다.
2) Composite 패턴
Composite의 Leaf 역활을 담당할 수 있습니다.
3) Singleton 패턴
Singleton 패턴이 Factory 역할을 겸할 수 있습니다.
하나의 인스턴스를 가지는 Singleton이 여러곳에서
공유되는 점이 비슷합니다.
댓글 없음:
댓글 쓰기