본문 바로가기

Java

람다 표현식을 활용한 디자인패턴 - 팩토리 패턴

디자인 패턴은 유용하다.

람다 표현식을 디자인 패턴에 적용한다면 더 간결하게 구현할 수 있다.

 

팩토리 패턴

팩토리 패턴을 사용하면 객체를 인스턴스화 할때 로직을 클라이언트에 노출하지 않을 수 있다.

코드로 살펴보자.

게임 캐릭터를 만들려고 하는데 두 가지 직업이 있다.(전사, 마법사)

팩토리 패턴을 이용하여 구현하면 다음과 같다.

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(3020);
            case "wizard":
                return new Wizard(1030);
            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(3020));
        map.put("wizard", () -> new Wizard(1030));
    }
 
    public static Character createCharacter(String character) {
        Supplier<Character> supplier = map.get(character);
        if (supplier != null){
            return supplier.get();
        }
        throw new IllegalArgumentException("없는 직업 입니다.");
    }
}

 

 

반응형