프로그래밍/자바 디자인패턴

디자인패턴 Flyweight 패턴

가카리 2012. 8. 15. 17:55
반응형

 

 

 

이름    

해설

BigChar

큰문자를 나타내는 클래스

BigCharFactory

BigChar의 인스턴스를 공유하면서 생성하는 클래스

BigString

BigChar를 모아서 만든 큰 문자열을 나타내는 클래스

Main

동작 테스트용 클래스

 

 

BigChar 클래스

 

package kch;

 

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{

                                BufferedReader reader = new BufferedReader(

                                                     new FileReader("big" + charname + ".txt"));

                                String line;

                                StringBuffer buf = new StringBuffer();//파일의 모든 정보는 buf 들어감

                                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);

          

           }

                    

}

 

 

BigCharFactory 클래스

 

package kch;

 

import java.util.HashMap;

 

public class BigCharFactory {

 

           //이미 만들어진 BigChar의 인스턴스를 관리

           private HashMap pool = new HashMap();

           //Singleton 패턴 인스턴스가 한개

           private static BigCharFactory singleton = new BigCharFactory();

          

           //생성자

           private BigCharFactory(){

           }

          

           public static BigCharFactory getInstance(){

                     return singleton;

           }

          

           //BigChar의 인스턴스 생성(공유)

           //synchronized 복수의 스레드가 new하는것을 방지하기위해서

           public synchronized BigChar getBigChar(char charname){

                    

                     BigChar bc = (BigChar)pool.get("" + charname);

                    

                    

                     //이부분이 핵심 기존에 이미 인스턴스가 있으면 그것을 다시 쓰고

                     //인스턴스가 없다면 해쉬테이블에 넣어둠.

                     //예를들어 112122 1 2란 인스턴스 2개만 있으면됨 112122 모두 인스턴스 6개를 만들필요가없음.

                     if(bc == null){

                               

                                bc = new BigChar(charname);//큰 숫자를 만들어서

                                pool.put("" + charname, bc);//해쉬테이블에 저장하게됨.

                               

                     }

                     return bc;//큰숫자를 반환

           }

          

}

 

 

BigString 클래스

 

package kch;

 

public class BigString {

          

           //큰문자의 배열

           private BigChar[] bigchars;

           //생성자

           public BigString(String string){//string에는 11221같은 값이 들어옴

                     bigchars  = new BigChar[string.length()];

                    

                     BigCharFactory factory = BigCharFactory.getInstance();

                     for(int i = 0 ;  i < bigchars.length ; i++){

                                bigchars[i] = factory.getBigChar(string.charAt(i));//큰숫자의 모임이 됨 bigchars배열은.

                     }

           }

          

          

           //표시

           public void print(){

                    

                     for(int i = 0; i < bigchars.length; i++){

                                bigchars[i].print();

                     }

           }

          

}

 

Main 클래스

 

package kch;

 

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 12123");

                                System.exit(0);

                     }

                    

                     BigString bs = new BigString(args[0]);

                     bs.print();

           }

}

 

 

 

 

컴파일시 유의 할 사항

인자를 넘겨줘야하기때문에 다음과 같이 합니다.

 

 

 

1. RunConfigurations를 누릅니다

 

 

 

2. Arguments 탭으로 가서 Program arguments 11221을 입력하고 Run버튼을 누릅니다.

 

결과화면.

 

 

이번 패턴은 인스턴스의 복수 생성 방지를 위한 패턴입니다. 어차피 같은 인스턴스면 재사용하는게 좋기때문에 가벼운급이라는 뜻의 Flyweight가 되었습니다.

 

핵심 부분은

BigCharFactory 클래스의

public synchronized BigChar getBigChar(char charname){

 

메소드인데 여기서 기존에 존재하는 인스턴스인지 아닌지를 확인한 후 기존에 있으면 기존것을 쓰고 없으면 해쉬테이블에서 추가합니다.

 

이 패턴의 특징은 만약에 11221이 입력되면 1 2라는 인스턴스 2개가 생기는데 1에 색깔을 바꾸게 되면 모든 1의 색깔이 바뀌게 됩니다. 이렇게 하나를 변경시키면 다른것도 모두 변경된다는 점이 특징입니다.

 

 

 

반응형

'프로그래밍 > 자바 디자인패턴' 카테고리의 다른 글

디자인패턴 Interpreter 패턴  (0) 2012.08.27
디자인패턴 Command 패턴  (1) 2012.08.18
디자인패턴 Proxy 패턴  (0) 2012.08.16
디자인패턴 State 패턴  (0) 2012.08.14
디자인 패턴 Memento 패턴  (0) 2012.08.13
디자인패턴 Observer 패턴  (0) 2012.08.10
디자인패턴 Mediator 패턴  (0) 2012.08.09
디자인패턴 Facade 패턴  (0) 2012.08.06