GoF 디자인패턴 - Flyweight

Clean Code Big Poo·2025년 6월 3일
0
post-thumbnail

Overview

디자인패턴 시작하기를 보고 정리하기

Flyweight

복싱의 fly 체급에서 따온 단어. (가볍고, 민첩)

  • 어떤 객체를 필요할 때 한번 생성, 이후 재활용
  • 객체 생성시 자원이 많이 소모될 경우, 훨씬 적은 자원으로 객체 재사용 가능.

다이어그램

  • Digit: 0~9 중 하나의 데이터.
    생성될 때 하나의 파일을 열고 데이터를 모두 메모리에 적재함
    (상당한 비용 발생).
    이를 이용해 화면에 표시.

  • DigitFactory : Digit 객체를 요청하면 Digit을 return 하는 역할.
    최초 요청시 한번만 Digit 을 생성, 이후 요청부터는 이전에 만들어둔 Digit 을 return 함.

  • Number : 긴 숫자를 화면에 출력하는 기능을 수행. DigitFatory에 Digit 을 요청함.


6개의 Disit 을 이용하지만, 6개를 생성하지 않음. 3개의 Disit 객체만 생성됨

구현 코드

Digit

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class Digit {
    private ArrayList<String> data = new ArrayList<String>();

    public Digit(String fileName){
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(fileName);
            br = new BufferedReader(fr);

            for(int i=0; i<8; i ++){
                String line = br.readLine();
                if (line.length() < 8) {
                    line = String.format("%-8s", line);
                }
                // 파일을 읽어와 메모리에 적재
                data.add(line);

            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                if(fr != null) fr.close();
                if(br != null) br.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    public String getLine(int index) {
        return this.data.get(index);
    }
}

DigitFactory

/// Digit 객체를 요청하면 Digit 객체를 전달하는 역할
public class DigitFactory {
    private Digit[] pool = new Digit[]{
            null,null,null,null,null,null,null,null,null,null,
    };

    public Digit getDigit(int n){
        if(pool[n] != null){
            return pool[n];
        }else{
            String fileName = String.format("./data/%d.txt", n);
            Digit digit = new Digit(fileName);
            pool[n] = digit;

            return digit;
        }
    }
}

Number

import java.util.ArrayList;

public class Number {
    private ArrayList<Digit> digits = new ArrayList<Digit>();

    public Number(int number){
        String strNum = Integer.toString(number);
        int len = strNum.length();

        DigitFactory digitFactory = new DigitFactory();
        for (int i = 0; i < len; i++){
            int n = Character.getNumericValue(strNum.charAt(i));
            Digit digit = digitFactory.getDigit(n);
            digits.add(digit);
        }
    }

    public void print(int x, int y) {
        for (int i = 0; i < 8; i++) {
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < digits.size(); j++) {
                sb.append(digits.get(j).getLine(i));
            }
            System.out.println(sb.toString());
        }
    }
}

Main

import java.util.ArrayList;

public class Main {
    public static void main(String[] args){
        Number number = new Number(434331);
        number.print(5,5);
    }
}

0개의 댓글