Flyweight

Flyweight ํŒจํ„ด์€ ์ˆ˜๋งŽ์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์˜ ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ , ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉ(๊ณต์œ )ํ•˜๋Š” ๋ฐฉ์‹์— ์žˆ์Šต๋‹ˆ๋‹ค.

       +----------------+
       |   Flyweight    |  <-- ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค
       +----------------+
              โ–ฒ
              โ”‚
   +-----------------------+
   | ConcreteFlyweight     |  <-- ์‹ค์ œ ๊ฐ์ฒด (๊ณต์œ  ๋Œ€์ƒ)
   +-----------------------+
              โ–ฒ
              โ”‚
   +-----------------------+
   | FlyweightFactory      |  <-- ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๊ณต์œ  ๊ด€๋ฆฌ
   +-----------------------+

์บ์‹œ(cache)๋‚˜ ํ’€(pool) ๋ฐฉ์‹์—์„œ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” id๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋ฉด ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ id๋ฅผ ๊ฐ€์ง„ ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ทธ๊ฐ’์„ ์ฃผ๊ณ  ์—†์œผ๋ฉด ์ƒˆ๋กญ๊ฒŒ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ถ”๊ฐ€ํ•ด์„œ ์ฃผ๋Š”(๊ณต์œ ) ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Java์˜ ์—ฌ๋Ÿฌ Cache ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.


How do code

public interface Flyweight {
    void operation();
}

// ๊ตฌ์ฒด์ ์ธ Flyweight ํด๋ž˜์Šค
public class ConcreteFlyweight implements Flyweight {
    private final String id;

    public ConcreteFlyweight(String id) {
        this.id = id;
    }

    @Override
    public void operation() {
        System.out.println("Flyweight ๊ฐ์ฒด " + id + "์˜ ์ž‘์—… ์ˆ˜ํ–‰");
    }
}

public class FlyweightFactory {
    // ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค์„ ์ €์žฅํ•˜๋Š” ์บ์‹œ
    private static final Map<String, Flyweight> pool = new HashMap<>();

    // id๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Flyweight ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
    public static Flyweight getFlyweight(String id) {
        if (pool.containsKey(id)) {
            return pool.get(id);
        } else {
            Flyweight flyweight = new ConcreteFlyweight(id);
            pool.put(id, flyweight);
            return flyweight;
        }
    }
}

Last updated