디자인 패턴은 유용하다.
람다 표현식을 디자인 패턴에 적용한다면 더 간결하게 구현할 수 있다.
팩토리 패턴
팩토리 패턴을 사용하면 객체를 인스턴스화 할때 로직을 클라이언트에 노출하지 않을 수 있다.
코드로 살펴보자.
게임 캐릭터를 만들려고 하는데 두 가지 직업이 있다.(전사, 마법사)
팩토리 패턴을 이용하여 구현하면 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
|
public class CharacterFactory {
public static Character createCharacter(String character) {
switch (character) {
case "warrior":
return new Warrior(30, 20);
case "wizard":
return new Wizard(10, 30);
default:
throw new IllegalArgumentException("없는 직업입니다.");
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class Warrior implements Character {
private int hp;
private int str;
public Warrior(final int hp, final int str) {
this.hp = hp;
this.str = str;
}
@Override
public String toString() {
return "Warrior{" +
"hp=" + hp +
", str=" + str +
'}';
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class Wizard implements Character {
private int hp;
private int mp;
public Wizard(final int hp, final int mp) {
this.hp = hp;
this.mp = mp;
}
@Override
public String toString() {
return "Wizard{" +
"hp=" + hp +
", mp=" + mp +
'}';
}
}
|
1
2
3
|
public interface Character {
}
|
위의 코드를 동작 시키는 Main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class Main {
public static void main(String[] args) {
Character warrior = CharacterFactory.createCharacter("warrior");
System.out.println(warrior);
Character wizard = CharacterFactory.createCharacter("wizard");
System.out.println(wizard);
//출력 결과
// Warrior{hp=30, str=20}
// Wizard{hp=10, mp=30}
}
}
|
람다 표현식
람다 표현식을 사용한다면 CharacterFactory 클래스가 깔끔하게 리펙토링 될 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;
public class CharacterFactory {
private final static Map<String, Supplier<Character>> map = new HashMap<>();
static {
map.put("warrior", () -> new Warrior(30, 20));
map.put("wizard", () -> new Wizard(10, 30));
}
public static Character createCharacter(String character) {
Supplier<Character> supplier = map.get(character);
if (supplier != null){
return supplier.get();
}
throw new IllegalArgumentException("없는 직업 입니다.");
}
}
|
반응형
'Java' 카테고리의 다른 글
디폴트 메서드 정리 (0) | 2020.04.24 |
---|---|
Optional 정리 (0) | 2020.04.18 |
람다 표현식을 활용한 디자인패턴 - 의무 체인 패턴 (0) | 2020.04.11 |
람다 표현식을 활용한 디자인패턴 - 옵저버 패턴 (0) | 2020.04.08 |
람다 표현식을 활용한 디자인패턴 - 템플릿 메서드 (0) | 2020.04.08 |