Flyweight pattern

ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด์€ ๋น„์šฉ์ด ํฐ ์ž์›์„ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ํŒจํ„ด์ด๋‹ค.

์ž์›์— ๋Œ€ํ•œ ๋น„์šฉ์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  1. ์ค‘๋ณต ์ƒ์„ฑ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ๊ฒฝ์šฐ

    • ์ค‘๋ณต ์ƒ์„ฑ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๋Š” ๊ฒƒ์€ ๋™์ผํ•œ ์ž์›์ด ์ž์ฃผ ์‚ฌ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Ÿฐ ์ž์› ๊ณตํ†ต ์ž์› ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•ด ์ฃผ๋Š” ํŽธ์ด ์ข‹๋‹ค.

  2. ์ž์› ์ƒ์„ฑ ๋น„์šฉ์€ ํฐ๋ฐ ์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ๋‚ฎ์€ ๊ฒฝ์šฐ

    • ์ด๋Ÿฐ ์ž์›์€ ํ•ญ์ƒ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ๋‘๋Š” ๊ฒƒ์€ ๋‚ญ๋น„์ด๋‹ค. ๋”ฐ๋ผ์„œ ์š”์ฒญ์ด ์žˆ์„ ๋•Œ์— ์ƒ์„ฑํ•ด์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ํŽธ์ด ์ข‹๋‹ค.

์ด ๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์„ ์œ„ํ•ด์„œ ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด์€ ์ž์› ์ƒ์„ฑ๊ณผ ์ œ๊ณต์„ ์ฑ…์ž„์ง„๋‹ค.

์ž์›์˜ ์ƒ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” Factory ์—ญํ• ๊ณผ ๊ด€๋ฆฌ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ์œผ๋‚˜, ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋‘ ์—ญํ• ์˜ ํฌ๊ธฐ๊ฐ€ ๊ทธ๋ฆฌ ํฌ์ง€ ์•Š์•„์„œ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‹ด๋‹นํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค.

์žฅ์ 

  • ๋งŽ์€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • ๋งŒํฅใ„ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

  • state pattern๊ณผ ์‰ฝ๊ฒŒ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  • ํŠน์ • ์ธ์Šคํ„ด์Šค์˜ ๊ณต์œ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ–‰๋™ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. (๊ฐœ๋ณ„ ์„ค์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.)

์‚ฌ์šฉ ์˜ˆ์‹œ

  • ๊ณ ์ „์ ์ธ ์‚ฌ์šฉ ์˜ˆ

    • ์›Œ๋“œ ํ”„๋กœ์„ธ์„œ์—์„œ ๋ฌธ์ž๋“ค์˜ ๊ทธ๋ž˜ํ”ฝ์  ํ‘œํ˜„์— ๋Œ€ํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ (ex ๊ธ€์ž๋ชจ์–‘ ์ •๋ณด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ)

  • JDK ์˜ˆ์ œ

    • java.lang.String

    • java.lang.Integer#valueOf(int) : ๋ฏธ๋ฆฌ ์ €์žฅ๋œ ์บ์‹œ ํ’€์—์„œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๊ณ , ๋งŒ์•ฝ ์—†์œผ๋ฉด ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋˜์–ด์žˆ์Œ.

    • java.lang.Boolean#valueOf(boolean)

    • java.lang.Byte#valueOf(byte)

    • java.lang.Character#valueOf(char)

๊ฐ„๋‹จ ๊ตฌํ˜„ ์˜ˆ์‹œ

public class FlyweightFactory {
    private static Map<String, Subject> map = new HashMap<String, Subject>();
โ€‹
    public Subject getSubject(String key) {
        Subject subject = map.get(key);
โ€‹
        if (subject == null) {
            subject = new Subject(key);
            map.put(key, subject);
โ€‹
            System.out.println("์ƒˆ๋กœ ์ƒ์„ฑ" + key);
        } else {
            System.out.println("์žฌ์‚ฌ์šฉ" + key);
        }
โ€‹
        return subject;
    }
}

Last updated