2015년 11월 6일 금요일

클래스 디자인 패턴 22. Flyweight Pattern

1. 개념
  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();
        }
    }
}


  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%B4


4. 관련패턴
  1) Proxy 패턴
       인스턴스 생성에 시간이 거리는 경우 인스턴스를 공유하여
        처리 속도를 향상시킬 수 있습니다.
       Proxy 에서는 대리인을 내세워 처리 속도를 올립니다.

  2) Composite 패턴
       Composite의 Leaf 역활을 담당할 수 있습니다.

  3) Singleton 패턴
       Singleton 패턴이 Factory 역할을 겸할 수 있습니다.
       하나의 인스턴스를 가지는 Singleton이 여러곳에서
       공유되는 점이 비슷합니다.

댓글 없음:

댓글 쓰기