π‘ νλΌμ΄μ¨μ΄νΈ(Flyweight) ν¨ν΄μ΄λ?
μ¬μ¬μ© κ°λ₯ν κ°μ²΄ μΈμ€ν΄μ€λ₯Ό 곡μ μμΌ λ©λͺ¨λ¦¬ μ¬μ©λμ μ΅μννλ ꡬ쑰 ν¨ν΄μ λλ€. κ° κ°μ²΄μ λͺ¨λ λ°μ΄ν°λ₯Ό μ μ§νλ λμ μ¬λ¬ κ°μ²΄λ€ κ°μ μνμ κ³΅ν΅ λΆλΆλ€μ 곡μ νμ¬ μ¬μ©ν μ μλ RAMμ λ λ§μ κ°μ²΄λ€μ ν¬ν¨ν μ μλλ‘ ν©λλ€.
μμ£Ό λ³νλ μμ±(extrinsic)κ³Ό λ³νμ§ μλ μμ±(intrinsic)μ λΆλ¦¬νκ³ , λ³νμ§ μλ μμ±μ μΊμνμ¬ μ¬μ¬μ©ν΄ λ©λͺ¨λ¦¬ μ¬μ©μ μ€μ λλ€. κ·Έλμ λμΌνκ±°λ μ μ¬ν κ°μ²΄λ€ μ¬μ΄μ κ°λ₯ν λ§μ λ°μ΄ν°λ₯Ό μλ‘ κ³΅μ νμ¬ μ¬μ©νλλ‘ νμ¬ μ΅μ νλ₯Ό λ Έλ¦¬λ κ²½λ ν¨ν΄μ΄λΌκ³ λΆλ¦½λλ€.
π‘ ν΄λμ€ λ€μ΄μ΄κ·Έλ¨μΌλ‘ λ³Έ νλΌμ΄μ¨μ΄νΈ ν¨ν΄
- Flyweight : κ²½λ κ°μ²΄λ₯Ό λ¬Άλ μΈν°νμ΄μ€.
- Flyweight State : νλΌμ΄μ¨μ΄νΈ λ΄λΆμ μ μ₯λ μνλ₯Ό κ³ μ ν(intrinsic) μνλΌκ³ νλ©°, νλΌμ΄μ¨μ΄νΈμ λ©μλμ μ λ¬λ μνλ₯Ό 곡μ ν(extrinsic) μνλΌκ³ νλ€.
- FlyweightFactory : κ²½λ κ°μ²΄λ₯Ό λ§λλ 곡μ₯ μν κ³Ό μΊμ μν μ κ²ΈλΉνλ Flyweight κ°μ²΄ κ΄λ¦¬ ν΄λμ€λ‘, getFlyweight() λ©μλλ ν©ν 리 λ©μλ μν μ νλ€. λ§μΌ κ°μ²΄κ° λ©λͺ¨λ¦¬μ μ‘΄μ¬νλ©΄ κ·Έλλ‘ κ°μ Έμ λ°ννκ³ , μλ€λ©΄ μλ‘ μμ±ν΄ λ°ννλ€. μ΄λ‘ μΈν΄ ν΄λΌμ΄μΈνΈλ νλΌμ¨μ΄μ΄νΈλ€μ μ§μ λ§λ€μ§ μλλ€.
π‘ νλ‘μ ν¨ν΄ ꡬν
- TreeFactory : FlyweightFactory
public class TreeFactory {
static Map<String, TreeType> treeTypes = new HashMap<>();
public static TreeType getTreeType(String name, Color color, String otherTreeData) {
TreeType result = treeTypes.get(name);
if (result == null) {
result = new TreeType(name, color, otherTreeData);
treeTypes.put(name, result);
}
return result;
}
}
- TreeType : Flyweight
public class TreeType { // 곡μ νλ μν
private String name;
private Color color;
private String otherTreeData;
public TreeType(String name, Color color, String otherTreeData) {
this.name = name;
this.color = color;
this.otherTreeData = otherTreeData;
}
public void draw(Graphics g, int x, int y) {
g.setColor(Color.BLACK);
g.fillRect(x - 1, y, 3, 5);
g.setColor(color);
g.fillOval(x - 5, y - 10, 10, 10);
}
}
- Tree : Context
public class Tree {
private int x;
private int y;
private TreeType type;
public Tree(int x, int y, TreeType type) {
this.x = x;
this.y = y;
this.type = type;
}
public void draw(Graphics g) {
type.draw(g, x, y);
}
}
- Forest : Client
public class Forest extends JFrame {
private List<Tree> trees = new ArrayList<>();
public void plantTree(int x, int y, String name, Color color, String otherTreeData) {
TreeType type = TreeFactory.getTreeType(name, color, otherTreeData);
Tree tree = new Tree(x, y, type);
trees.add(tree);
}
@Override
public void paint(Graphics graphics) {
for (Tree tree : trees) {
tree.draw(graphics);
}
}
}
π‘ λ§λ¬΄λ¦¬
νλΌμ΄μ¨μ΄νΈ ν¨ν΄μ
- μ΄ν리μΌμ΄μ μ μν΄ μμ±λλ κ°μ²΄μ μκ° λ§μ μ μ₯ λΉμ©μ΄ λμμ§ λ
- μμ±λ κ°μ²΄κ° μ€λλλ‘ λ©λͺ¨λ¦¬μ μμ£Όνλ©° μ¬μ©λλ νμκ° λ§μ λ
- 곡ν΅μ μΈ μΈμ€ν΄μ€λ₯Ό λ§μ΄ μμ±νλ λ‘μ§μ΄ ν¬ν¨λμμ λ
- μλ² λλμ κ°μ΄ λ©λͺ¨λ¦¬λ₯Ό μ΅μνμΌλ‘ μ¬μ©ν΄μΌ ν λ
μ μ¬μ©ν μ μμ΅λλ€.
νλΌμ΄μ¨μ΄νΈ ν¨ν΄μ μ¬μ©νλ©΄ μ ν리μΌμ΄μ μμ μ¬μ©νλ λ©λͺ¨λ¦¬λ₯Ό μ€μΌ μ μκ³ , νλ‘κ·Έλ¨ μλλ₯Ό κ°μ ν μ μμ΅λλ€.