ํ๋ผ์ด์จ์ดํธ ํจํด (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
๋ณต์ฌ