Search

ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด

ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด (Flyweight Pattern)

๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๊ณต์œ  ๊ฐ€๋Šฅํ•œ ๋‚ด๋ถ€ ์ƒํƒœ(Intrinsic State)์™€ ์™ธ๋ถ€ ์ƒํƒœ(Extrinsic State)๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ๋™์ผํ•œ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋“ค์„ ๊ณต์œ ํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋งŽ์€ ์ˆ˜์˜ ์œ ์‚ฌํ•œ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋งค์šฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ๋ชฉ์ 

โ€ข
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์ ํ™”
โ€ข
๊ฐ์ฒด ์ƒ์„ฑ ๋น„์šฉ ์ ˆ๊ฐ
โ€ข
๊ฐ์ฒด ๊ณต์œ ๋ฅผ ํ†ตํ•œ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

ํŠน์ง•

โ€ข
๊ณต์œ  ๊ฐ€๋Šฅํ•œ ์ƒํƒœ(intrinsic)์™€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ(extrinsic)๋ฅผ ๋ถ„๋ฆฌ
โ€ข
ํŒฉํ† ๋ฆฌ๋ฅผ ํ†ตํ•œ ๊ฐ์ฒด ๊ด€๋ฆฌ ๋ฐ ๊ณต์œ 
โ€ข
๋ถˆ๋ณ€์„ฑ(Immutable) ๋ณด์žฅ์ด ์ค‘์š”

์˜ˆ์‹œ ์ฝ”๋“œ

// Flyweight ๊ฐ์ฒด class Character { private final char symbol; // ๋‚ด๋ถ€ ์ƒํƒœ public Character(char symbol) { this.symbol = symbol; } public void display(int fontSize) { // ์™ธ๋ถ€ ์ƒํƒœ System.out.println("Character: " + symbol + ", Size: " + fontSize); } } // Flyweight ํŒฉํ† ๋ฆฌ class CharacterFactory { private Map<Character, Character> characters = new HashMap<>(); public Character getCharacter(char symbol) { Character character = characters.get(symbol); if (character == null) { character = new Character(symbol); characters.put(symbol, character); } return character; } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ ์„ค๋ช…

์œ„ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ๋ฌธ์ž(Character)๋ฅผ ํ”Œ๋ผ์ด์›จ์ดํŠธ ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
โ€ข
Character ํด๋ž˜์Šค (Flyweight)
โ—ฆ
symbol(๋‚ด๋ถ€ ์ƒํƒœ): ๋ฌธ์ž ๊ฐ’์„ ์ €์žฅํ•˜๋ฉฐ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค ๊ฐ„์— ๊ณต์œ ๋จ
โ—ฆ
display ๋ฉ”์„œ๋“œ: fontSize(์™ธ๋ถ€ ์ƒํƒœ)๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๊ฐ ์‚ฌ์šฉ ์ปจํ…์ŠคํŠธ์— ๋งž๊ฒŒ ์ฒ˜๋ฆฌ
โ€ข
CharacterFactory ํด๋ž˜์Šค (Flyweight Factory)
โ—ฆ
characters Map: ์ƒ์„ฑ๋œ Character ๊ฐ์ฒด๋“ค์„ ์บ์‹œ๋กœ ์ €์žฅ
โ—ฆ
getCharacter ๋ฉ”์„œ๋“œ: ์š”์ฒญ๋œ ๋ฌธ์ž์— ๋Œ€ํ•œ Character ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ์žฌ์‚ฌ์šฉํ•˜๊ณ , ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ
์ด ๊ตฌํ˜„์„ ํ†ตํ•ด ๋™์ผํ•œ ๋ฌธ์ž๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒˆ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

CharacterFactory factory = new CharacterFactory(); // ๋™์ผํ•œ 'a' ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ํฌ๊ธฐ๋กœ ํ‘œ์‹œ Character charA1 = factory.getCharacter('a'); Character charA2 = factory.getCharacter('a'); charA1.display(10); // ํฌ๊ธฐ 10์œผ๋กœ 'a' ํ‘œ์‹œ charA2.display(16); // ํฌ๊ธฐ 16์œผ๋กœ 'a' ํ‘œ์‹œ // charA1๊ณผ charA2๋Š” ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ (๊ฐ์ฒด ์žฌ์‚ฌ์šฉ) System.out.println(charA1 == charA2); // true
Java
๋ณต์‚ฌ