Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

낭비를 없애기 - Flyweight Pattern 본문

Java/디자인 패턴

낭비를 없애기 - Flyweight Pattern

Seung__ 2021. 11. 15. 21:57

1.  Flyweight Pattern ??


  • 공유할 수 있는 객체는 공유하여 사용한다.
  • 규모가 작고, 인스턴스 마다 특성이 따로 없다면 공유해서 사용할 수 있다.

 

 

 

2. 의도와 동기


  • 각 단어를 각각 표현하기보다는 문자를 공유하여 표현하면 비용이 훨씬적게 소요됨
  • 각 객체가 부가적인 상태 (글꼴등...)이 있다면 따로 관리해야 하는 경우가 있음
  • 작은 여러개의 객체를 관리해야 할때 주로 사용

 

 

 

3. Class diagram


 

 

4. 객체 협력 (collaborations)


  • Flyweight

각 객체가 사용할 인터페이스를 정의한다.

  • CocreteFlyweight

공유될 수 있는 실제적 객체를 구현

  • UnSharedCocreteFlyweight

각 인스턴스마다 가지게 되는 부가적인 특성이 있다면 구현한다.

  • FlyweightFactory

Flyweight에 pool을 관리한다. 각 Flyweight 객체는 Singleton으로 생성한다.

 

 

5. 중요한 결론 (consequence)


  • 공유를 통하여 인스턴스의 수를 절약한다.
  • 인스턴스마다의 특성이 거의 없는 객체에 사용하는 것이 효율적이다.
  • 부가적인 정보가 많은 경우는 비효율적일 수 있다.

 

 

 

6. 예제


  • 문자열을 입력했을 때, 각 문자에 해당하는 파일이 있는경우 파일의 값을 불러온다.
  • 만약 엎으면 문자 + ?? 을 출력한다.
  • 각 파일은 다음과 같이 생성한다.

 

  • big1.txt
----##----
----##----
----##----
----##----
----##----
----##----
----##----
  • big2.txt
##########
--------##
--------##
##########
##--------
##--------
##########
  • big3.txt
##########
--------##
--------##
--########
--------##
--------##
##########
  • 따라서 123abc123과 같은 String이 주어지면 아래와 같이 차례대로 출력되는 코드를 작성해 보자.
  • 즉 문자 마다 해당되는 파일의 인스턴스를 공유한다!
----##----
----##----
----##----
----##----
----##----
----##----
----##----

##########
--------##
--------##
##########
##--------
##--------
##########

##########
--------##
--------##
--########
--------##
--------##
##########

a??
b??
c??
----##----
----##----
----##----
----##----
----##----
----##----
----##----

##########
--------##
--------##
##########
##--------
##--------
##########

##########
--------##
--------##
--########
--------##
--------##
##########
  • 주어진 문자에 해당하는 파일은 읽어서 인스턴스를 생성.
    • 예를들어 "1"이 주어지면 big1.txt의 값을 읽어와서 해당 파일의 값을 보관.
public class BigChar {

    private char charName;
    private String fontData;

    public BigChar(char charName) {
        this.charName = charName;

        try {
            //bigxx.txt파일의 data 가져옴.
            BufferedReader bufferedReader = new BufferedReader(new FileReader("big" + charName + ".txt"));
            String line;
            StringBuffer buf = new StringBuffer();

            while ((line = bufferedReader.readLine()) != null){
                buf.append(line);
                buf.append("\n");
            }
            bufferedReader.close();
            
            //fontData에 파일에서 읽은 값 보관.
            this.fontData = buf.toString();
        } catch (IOException e) {
            this.fontData = charName + "??";
        }
    }

    //출력
    public void print(){
        System.out.println(fontData);
    }
}
  • BigChar 객체를 생성하기 위한 Factory
    • 주어진 문자 & BigChar 객체(파일 data 가지고 있음)를 key&value로  pool에서 관리함.
    • factory는 singleton
    • getBigChar에 synchronized사용 이유; pool은 공용 resource임. 따라서 해당 메서드를 통해 pool에 접근하는 경우 다른 thread에서 resource에 접근하지 못하도록 resource를 lock.
    • getBigChar()를 통해 이미 인스턴스가 있으면 해당 인스턴스를 가져오고 없으면 생성한다.
public class BigCharFactory {

    private HashMap<String, BigChar> pool =  new HashMap<>();

    private static BigCharFactory singleton = new BigCharFactory();

    private BigCharFactory() {
    }

    public static BigCharFactory getInstance(){
        return singleton;
    }

  
    public synchronized BigChar getBigChar(char charName){
        BigChar bc = pool.get(""+ charName);
        if (bc == null){
            bc = new BigChar(charName);
            pool.put(""+charName, bc); //char를 String으로 바꾸기 위해 "" 추가함.
        }
        return bc;
    }
}
  • 주어진 문자를 BigChar의 배열로 관리하는 BigString class
    • BigString생성 시 String을 주입받고 해당 String을 가지고 factory를 통해 BigChar 배열을 생성.
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();
        }
    }
}
  • Test
public class Main {

    public static void main(String[] args) {
        BigString bs = new BigString("123abc123");
        bs.print();
    }
}
  • 결과
----##----
----##----
----##----
----##----
----##----
----##----
----##----

##########
--------##
--------##
##########
##--------
##--------
##########

##########
--------##
--------##
--########
--------##
--------##
##########

a??
b??
c??
----##----
----##----
----##----
----##----
----##----
----##----
----##----

##########
--------##
--------##
##########
##--------
##--------
##########

##########
--------##
--------##
--########
--------##
--------##
##########

 

 

7. GitHub : 211115 flyweight  Pattern


 

GitHub - bsh6463/designPattern

Contribute to bsh6463/designPattern development by creating an account on GitHub.

github.com

 

Comments