Computer Science

Flyweight Pattern | 플라이웨이트 패턴

연_우리 2022. 8. 16. 22:11
반응형

목차

     

     

     

     

    어떤 상황에서 쓰일까?

    글자에는 글꼴, 크기, 색깔, 내용 등의 속성이 있다.

    우리가 문서를 작성할 때 보통 글꼴과 크기는 일관되게 맞추기때문에 변경할 일이 거의 없다!

    하지만 내용과 색깔은 시시때때로 변하는 속성이다.

     

    글자 객체는 글꼴 객체 + 크기 객체 + 색깔 객체 + 내용 객체의 조합으로 만들어 진다하면

    자주 변하지 않는 글꼴 객체와 크기 객체를 매번 생성할 필요가 있을까?

    하나 만들어 두고 공통적으로 사용해도 되지 않을까?

     

     

     

    플라이웨이트 패턴이란?

    객체를 가볍게 만들어 메모리 사용을 줄이는 패턴이다.

    자주 변하는 속성과 자주 변하지 않는 속성을 분리하고 재사용하여 메모리 사용을 줄인다!

     

    불필요한 인스턴스 생성을 최소화하기 때문에

    필요할때마다 새로운 인스턴스를 생성할때마다 메모리를 적게 사용하고

    빠른 프로그램 작성이 가능해진다

     

     

     

    장점

     

     

    단점

     

     

     

    구현코드

    기존코드

    public class Character {
        private char value;
        private String color;
        private String fontFamily;
        private int fontSize;
    }
    public class Client {
    
        public static void main(String[] args) {
            Character c1 = new Character('h', "white", "Nanum", 12);
            Character c2 = new Character('e', "white", "Nanum", 12);
            Character c3 = new Character('l', "white", "Nanum", 12);
            Character c4 = new Character('l', "white", "Nanum", 12);
            Character c5 = new Character('o', "white", "Nanum", 12);
        }
    }

     

     

     

    변경코드

    public class 💙Character {
        private char value;
        private String color;
        private 💚Font font;
    }
    ----------------------------------------
    public final class 💚Font {
        final String family;
        final int size;
    }
    ----------------------------------------
    public class FontFactory {
    
        private Map<String, 💚Font> cache = new HashMap<>();
        //일종의 캐시역할을 수행한다!
    
        public Font getFont(String font) {
            if (cache.containsKey(font)) {
            	//캐시에 존재하면 해당 객체를 반환 
                return cache.get(font);
               
            } else {
            	//캐시에 존재하지 않으면 새로운 객체를 생성
                String[] split = font.split(":");
                Font newFont = new Font(split[0], Integer.parseInt(split[1]));
                cache.put(font, newFont);
                return newFont;
            }
        }
    }
    public class Client {
    
        public static void main(String[] args) {
            FontFactory fontFactory = new FontFactory();
            Character c1 = new Character('h', "white", fontFactory.getFont("nanum:12"));
            Character c2 = new Character('e', "white", fontFactory.getFont("nanum:12"));
            Character c3 = new Character('l', "white", fontFactory.getFont("nanum:12"));
        }
    }

     

     

    반응형
    • 네이버 블러그 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 구글 플러스 공유하기
    • 카카오톡 공유하기