βοΈ Java Design-Pattern XXβ - Flyweight
βοΈ Java Design-Pattern XXβ
- Flyweight
π
γJAVA μΈμ΄λ‘ λ°°μ°λ λμμΈ ν¨ν΄ : μ½κ² λ°°μ°λ GoFμ 23κ°μ§ λμμΈ ν¨ν΄γ
λ₯Ό μ½κ³ μ 리ν κΈμ λλ€.
Flyweight
ν¨ν΄μ΄λ?
Flyweight
λ 볡μ±μμ κ°μ₯ κ°λ²Όμ΄ 체κΈμΈ νλΌμ΄κΈμ λνλΈλ€.- μ¦, μ΄ λμμΈ ν¨ν΄μ κ°μ²΄λ₯Ό κ°λ³κ² λ§λ€κΈ° μν κ²μ΄λ€.
- μ¬κΈ°μ λ§νλ 무κ²λ λ©λͺ¨λ¦¬ μ¬μ©λμ μλ―Ένλ€.
Java
μμλnew
ν€μλλ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό λ§λ€ μ μλ€.- κ·Έλ¬λ νΉμ ν΄λμ€μ μΈμ€ν΄μ€κ° λ§μ΄ νμν΄μ
new
λ₯Ό μλ© μ¬μ©νλ©΄ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ»€μ§λ€. Flyweight
ν¨ν΄μμ μ¬μ©νλ κΈ°λ²μ ν μ€λ‘ μμ½νλ©΄, βμΈμ€ν΄μ€λ₯Ό μ΅λν 곡μ νκ³ μΈλ°μμ΄new
νμ§ μλ κ²βμ΄λ€.- μΈμ€ν΄μ€κ° νμν λ νμ
new
ν€μλλ₯Ό μ¬μ©νλ κ²μ΄ μλλΌ, μ΄λ―Έ λ§λ€μ΄μ§ μΈμ€ν΄μ€λ₯Ό μ΄μ©ν μ μλ€λ©΄ κ·Έκ²μ 곡μ ν΄μ μ¬μ©νλ κ²μ΄λ€.
μμ νλ‘κ·Έλ¨
- λ¬΄κ±°μ΄ μΈμ€ν΄μ€λ₯Ό λ§λλ ν΄λμ€λ‘ ν° λ¬Έμλ₯Ό νννλ μμ νλ‘κ·Έλ¨μ΄λ€.
- ν° λ¬Έμλ μμ λ¬Έμλ₯Ό λͺ¨μμ λ§λ λ€.
BigChar
λ ν° λ¬Έμλ₯Ό νννλ ν΄λμ€λ‘, λ©λͺ¨λ¦¬ μλΉλ₯Ό μ€μ΄κΈ° μν΄ ν΄λΉ μΈμ€ν΄μ€λ₯Ό 곡μ νλ κ²μ΄ κ΄κ±΄μ΄λ€.- ν΄λΉ μΈμ€ν΄μ€κ° μ΄λ―Έ μ‘΄μ¬νλμ§ μ¬λΆλ₯Ό κ΄λ¦¬νλλ‘
java.util.HashMap
μ μ¬μ©νλ€.
μ«μ νμΌ
....######......
..##......##....
..##......##....
....######......
..##......##....
..##......##....
....######......
................
- 10 λ―Έλ§μ μ«μμ β-β κΈ°νΈμ λν νμΌμ΄ μ‘΄μ¬νλ€.
- μλ₯Ό λ€λ©΄ μ νμΌμ
big8.txt
μ΄λ€.
BigChar
ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class BigChar {
// λ¬Έμμ μ΄λ¦
private char charname;
// ν° λ¬Έμλ₯Ό νννλ λ¬Έμμ΄('#' '.' '\n'μΌλ‘ μ΄λ£¨μ΄μ§ μ΄)
private String fontdata;
// μμ±μ
public BigChar(char charname) {
this.charname = charname;
try {
String filename = "big" + charname + ".txt";
StringBuilder sb = new StringBuilder();
for (String line: Files.readAllLines(Path.of(filename))) {
sb.append(line);
sb.append("\n");
}
this.fontdata = sb.toString();
} catch (IOException e) {
this.fontdata = charname + "?";
}
}
// ν° λ¬Έμλ₯Ό νμνλ€
public void print() {
System.out.print(fontdata);
}
}
- ν° λ¬Έμλ₯Ό λνλ΄λ ν΄λμ€μ΄λ€.
- μμ±λ λ¬Έμμ΄μ
fontdata
νλμ μ μ₯νλ€.
BigCharFactory
ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.HashMap;
import java.util.Map;
public class BigCharFactory {
/* μ΄λ―Έ λ§λ BigChar μΈμ€ν΄μ€λ₯Ό κ΄λ¦¬ */
private Map<String,BigChar> pool = new HashMap<>();
/* Singleton ν¨ν΄ */
private static BigCharFactory singleton = new BigCharFactory();
/* μμ±μ */
private BigCharFactory() { }
/* μ μΌν μΈμ€ν΄μ€λ₯Ό μ»λλ€ */
public static BigCharFactory getInstance() {
return singleton;
}
/* BigChar μΈμ€ν΄μ€ μμ±(곡μ ) */
public synchronized BigChar getBigChar(char charname) {
BigChar bc = pool.get(String.valueOf(charname));
if (bc == null) {
// μ¬κΈ°μ BigChar μΈμ€ν΄μ€λ₯Ό μμ±
bc = new BigChar(charname);
pool.put(String.valueOf(charname), bc);
}
return bc;
}
}
BigChar
μ μΈμ€ν΄μ€λ₯Ό λ§λλ 곡μ₯μ΄λ€.pool
νλλBigChar
μ μΈμ€ν΄μ€λ₯Ό κ΄λ¦¬νλ€.- μ¦,
BigCharFactory
μpool
μλ μ΄λ―Έ λ§λ€μ΄μ§BigChar
μΈμ€ν΄μ€κ° λͺ¨μ¬μλ€. - κ°λ Ή λ¬Έμ β3βμ λμνλ
BigChar
λ₯Ό μ»κ³ μΆμ κ²½μ° β3βμ΄λΌλ λ¬Έμμ΄μ΄ ν€κ° λκ³ , νμΌbig3.txt
λ‘λΆν° λ§λ€μ΄μ§λBigChar
μΈμ€ν΄μ€κ° κ°μ΄ λλ€. BigCharFactory
ν΄λμ€λSingleton
ν¨ν΄μ μ¬μ©ν΄ ꡬννλ€.- ν΄λΉ μΈμ€ν΄μ€λ νλλ§ νμνκΈ° λλ¬Έμ΄λ€.
getBigChar()
λ©μλλFlyweight
ν¨ν΄μ μ€μ¬μ΄ λλ λ©μλμ΄λ€.- μ΄ λ©μλλ μ£Όμ΄μ§ μΈμμ ν΄λΉνλ
BigChar
μΈμ€ν΄μ€λ₯Ό λ§λ λ€. - λ¨, μ΄λ―Έ κ°μ λ¬Έμμ ν΄λΉνλ μΈμ€ν΄μ€κ° μ‘΄μ¬νλ€λ©΄, μλ‘ λ§λ€μ§λ μλλ€.
getBigChar()
λ©μλκ°syncronized
λ‘ λμ΄ μλ μ΄μ λ λ©ν° μ°λ λ νκ²½μμ ν λ²μ νλμ μ°λ λλ§ μ΄ λ©μλλ₯Ό μ€ννλλ‘ κ°μ νκΈ° μν¨μ΄λ€.
BigString
ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class BigString {
/* 'ν° λ¬Έμ'μ λ°°μ΄ */
private BigChar[] bigchars;
/* μμ±μ */
public BigString(String string) {
BigCharFactory factory = BigCharFactory.getInstance();
bigchars = new BigChar[string.length()];
for (int i = 0; i < bigchars.length; i++) {
bigchars[i] = factory.getBigChar(string.charAt(i));
}
}
/* νμ */
public void print() {
for (BigChar bc: bigchars) {
bc.print();
}
}
}
BigChar
λ₯Ό λͺ¨μ ν° λ¬Έμμ΄ ν΄λμ€μ΄λ€.bigchars
νλλBigChar
μ λ°°μ΄μ΄λ©°BigChar
μ μΈμ€ν΄μ€λ₯Ό μ μ₯νλ€.- μμ±μμ
for
λ¬Έμ 보면getBigChar()
λ©μλλ₯Ό μ¬μ©ν΄ μμ±λμ΄ μλ€. - μ¦,
new
ν€μλλ₯Ό μ¬μ©νμ§ μμκΈ° λλ¬Έμ κ°μ λ¬Έμμ΄μμ μμ±νλBigChar
μΈμ€ν΄μ€λ 곡μ λλ€.
Main
ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("Usage: java Main digits");
System.out.println("Example: java Main 1212123");
System.exit(0);
}
BigString bs = new BigString(args[0]);
bs.print();
}
}
- μ£Όμ΄μ§ μΈμλ₯Ό λ°νμΌλ‘ λ¬Έμμ΄μ μμ±νκ³ μΆλ ₯νλ€.
Flyweight
ν¨ν΄μ λ±μ₯μΈλ¬Ό
BigChar
ν΄λμ€
- νμμ²λΌ λ€λ£¨λ©΄ νλ‘κ·Έλ¨μ΄ 무거μμ§κΈ° λλ¬Έμ 곡μ νκΈ° νΈμ΄ λμ κ²μ λνλ΄λ νλΌμ΄κΈ(
Flyweight
) μμ λ§‘μλ€.
BigCharFactory
ν΄λμ€
Flyweight
λ₯Ό λ§λλ 곡μ₯μΈ νλΌμ΄κΈ 곡μ₯(FlyweightFactory
) μμ λ§‘μλ€.- μ΄ κ³΅μ₯μ μ¬μ©ν΄
Flyweight
λ₯Ό λ§λ€λ©΄ μΈμ€ν΄μ€κ° 곡μ λλ€.
BigString
ν΄λμ€
FlyweightFactory
μ μ¬μ©νμ¬Flyweight
λ₯Ό λ§λ€μ΄λ΄κ³ μ΄μ©νλ μλ’°μ(Client
) μμ λ§‘μλ€.
μ± μμ μ μνλ ννΈ
μ¬λ¬ μ₯μμ μν₯μ λ―ΈμΉλ€.
- μΈμ€ν΄μ€λ₯Ό 곡μ ν λλ μ¬λ¬ κ³³μ μν₯μ λ―ΈμΉλ€λ μ μ μ£Όμν΄μΌ νλ€.
- μ¦, νλμ μΈμ€ν΄μ€λ₯Ό λ³κ²½νλ κ²λ§μΌλ‘ ν΄λΉ μΈμ€ν΄μ€λ₯Ό μ¬μ©νλ λͺ¨λ κ³³μ λμμ λ³κ²½ μ¬νμ΄ λ°μλλ€.
- κ°λ Ή
BigChar
ν΄λμ€μμ β3βμfontdata
λ₯Ό λ³κ²½νλ€λ©΄BigString
μμ μ¬μ©λλ β3βμ κΈκΌ΄μ λͺ¨λ λ³κ²½λλ€. - μ΄λ κ² μ¬λ¬ κ³³μ μν₯μ λ―ΈμΉλ κ²μ΄ νλ‘κ·Έλ¨μ΄ λ€λ£¨λ λ¬Έμ μ λ°λΌ μ’μ κ²½μ°λ μκ³ κ·Έλ μ§ μμ κ²½μ°λ μλ€.
- κ·Έλ¬λ―λ‘
Flyweight
μμ΄ κ°μ§ μ 보λ μ μκ°ν΄μ 골λΌμΌ νλ€. - μ λ§ μ¬λ¬ κ³³μμ 곡μ ν΄μΌ ν μ λ³΄λ§ ν΄λΉ μμ΄ κ°λλ‘ νλ κ²μ΄ μ¬λ°λ₯΄λ€.
- μμ νλ‘κ·Έλ¨μ μμ μΆκ°νλ€κ³ νλ©΄ ν΄λΉ μ 보λ μ΄λ€ ν΄λμ€κ° κ°λλ‘ ν΄μΌ ν κΉ?
- λ§μ½
BigChar
μ μ μ 보λ₯Ό κ°λλ‘ νλ€λ©΄BigChar
λ³λ‘ μ μ λ³΄κ° κ³΅μ λμ΄ λ°μλ κ²μ΄λ€. - κ°λ Ή
BigString
μ μ μ 보λ₯Ό κ°κ² νλ€κ³ νλ©΄, βμΈ λ²μ§Έ κΈμλ λΉ¨κ°μβκ³Ό κ°μ μ μ 보λ₯ΌBigString
μ΄ κ°κ² νμ¬, κ°μBigChar
μΈμ€ν΄μ€λΌλ λ€λ₯Έ μμΌλ‘ μ§μ ν μ μλ€. - μ΄λ€ μ 보λ₯Ό 곡μ νκ³ , 곡μ νμ§ μμ μ§ ν΄λμ€ μ¬μ© λͺ©μ μ λ¬λ € μλ€.
intrinsic
κ³Ό extrinsic
- 곡μ νλ μ 보λ
intrinsic
ν μ 보λΌκ³ νλ€. - κ·Έ μΈμ€ν΄μ€λ₯Ό μ΄λμ κ°μ§κ³ κ°λ μ΄λ€ μν©μμλ λ³νμ§ μλ μ 보λ€.
- κ°λ Ή
BigChar
μ ν°νΈ λ°μ΄ν°λBigString
μ μ΄λμ λ±μ₯ν΄λ λ³νμ§ μλλ€. - 곡μ νμ§ μλ μ 보λ₯Ό
extrinsic
ν μ 보λΌκ³ νλ€. - μΈμ€ν΄μ€ λ°°μΉ μ₯μμ λ°λΌ λ³κ²½λλ μ 보, μν©μ λ°λΌ λ³ννλ μ 보, μνμ μμ‘΄νλ μ 보μ΄λ€.
- κ°λ Ή
BigChar
μ μΈμ€ν΄μ€κ°BigString
μ λͺ λ²μ§Έ λ¬ΈμμΈκ° νλ μ 보λBigChar
μ μμΉμ λ°λΌ λ¬λΌμ§λ―λ‘BigChar
κ° κ°μ§ μλ μλ€.
κ΄λ¦¬λλ μΈμ€ν΄μ€λ κ°λΉμ§ 컬λ μ λμ§ μλλ€.
BigCharFactory
μμλjava.util.HashMap
μ μ΄μ©ν΄μ μμ±νBigChar
μ μΈμ€ν΄μ€λ₯Ό κ΄λ¦¬νλ€.- μ΄μ²λΌ μΈμ€ν΄μ€λ₯Ό κ΄λ¦¬νλ κΈ°λ₯μ ꡬννμ λ, λ°λμ βκ΄λ¦¬λλ μΈμ€ν΄μ€λ κ°λΉμ§ 컬λ μ λμ§ μλλ€βλ μ μ μμν νμκ° μλ€.
- μμ νλ‘κ·Έλ¨μ 보면
pool
νλλ‘BigChar
μΈμ€ν΄μ€λ₯Ό κ΄λ¦¬νκ³ μλ€. - μ€μ λ‘
BigString
μΈμ€ν΄μ€μμBigChar
μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νμ§ μλλΌλpool
νλλ‘ κ΄λ¦¬λκ³ μμΌλ―λ‘ μ°λ κΈ°λ‘ κ°μ£Όλμ§ μλλ€. - κ·Έλ λ€λ κ²μ μΌλ¨ ν λ² λ§λ
BigChar
ν΄λμ€μ μΈμ€ν΄μ€λ λ©λͺ¨λ¦¬μ κ³μ λ¨μμλ€λ λ§μ΄λ€. - μ₯μκ° λλ μ μ λ©λͺ¨λ¦¬λ‘ λμνλ νλ‘κ·Έλ¨μ μ€κ³ν κ²½μ° μ΄ μ μ μ μν΄μΌ νλ€.
- μΈμ€ν΄μ€λ₯Ό λͺ μμ μΌλ‘ μμ ν μ μμ§λ§, μΈμ€ν΄μ€μ λν μ°Έμ‘°λ₯Ό μμ¨ μλ μλ€.
- κ°λ Ή
HashMap
μμ ν΄λΉ μΈμ€ν΄μ€λ₯Ό ν¬ν¨ν μνΈλ¦¬λ₯Ό μμ νλ©΄ μΈμ€ν΄μ€μ λν μ°Έμ‘°λ₯Ό μμ¨ μ μλ€.
λ©λͺ¨λ¦¬ μ΄μΈμ 리μμ€
Flyweight
ν¨ν΄μ μ¬μ©νλ©΄ λ©λͺ¨λ¦¬ μ¬μ©λμ μ€μΌ μ μλ€κ³ νλ€.- λ μΌλ°μ μΌλ‘ μκΈ°νλ©΄, μΈμ€ν΄μ€λ₯Ό 곡μ νλ©΄ μΈμ€ν΄μ€λ₯Ό μμ±νλ λ° νμν 리μμ€λ₯Ό μ€μΌ μ μλ€.
- κ°λ Ή μΈμ€ν΄μ€λ₯Ό μλ‘ λ§λλ νμλ₯Ό μ€μΌ μ μκ³ , μ΄λ₯Ό ν΅ν΄ νλ‘κ·Έλ¨ μλλ₯Ό ν₯μμν¬ μ μλ€.
- νμΌ νΈλ€μ΄λ μλμ° νΈλ€ λ±λ μμμ μΌμ’ μ΄λ€.
OS
μ λ°λΌμλ λμμ μ¬μ©ν μ μλ νμΌ νΈλ€μ΄λ μλμ° νΈλ€ μμ μ νμ΄ μκ³ , κ·Έλ΄ λ μΈμ€ν΄μ€λ₯Ό 곡μ ν΄λμ§ μμΌλ©΄ μ΄ μ νμ κ±Έλ € νλ‘κ·Έλ¨μ΄ λμνμ§ μμ μνμ΄ μλ€.
static Factory Method
- μμ νλ‘κ·Έλ¨μ
BigCharFactory
ν΄λμ€μλ μΈμ€ν΄μ€λ₯Ό μ»κΈ° μνstatic
λ©μλκ° λͺ κ° λ±μ₯νλ€. getInstance()
λ©μλλ μ μΌν μΈμ€ν΄μ€λ₯Ό μ»κΈ° μν κ²μ΄κ³ ,String.valueOf()
λ©μλλ νΉμ λ¬Έμμ λμνλ λ¬Έμμ΄ ννμ μ»κΈ° μν κ²μ΄λ€.- μ΄λ€μ
static Factory Method
λΌκ³ ν μ μλ€.
This post is licensed under CC BY 4.0 by the author.