LoginSignup
16
13

More than 5 years have passed since last update.

オブジェクト指向で作るFizzBuzz

Last updated at Posted at 2016-08-06

FizzBuzzはみなご存知の通り、初心者向けのアルゴリズムの課題である。
そのFizzBuzzをオブジェクト指向で作ってみようと思ってやってみた。

普通のFizzBuzzのソース

誰が作ってもだいたいこんなソースになると思う。

リスト1
public class Game {
    public static void main(String[] args) {
        for (int i = 1; i < 50; i++) {
            if (i % 3 == 0 && i % 5 == 0) {
                System.out.println("FizzBuzz");
            } else if (i % 5 == 0) {
                System.out.println("Buzz");
            } else if (i % 3 == 0) {
                System.out.println("Fizz");
            } else {
                System.out.println(i);
            }
        }
    }
}

オブジェクト指向のFizzBuzzのソース

作ってみたらこうなった。
GameクラスではFacadeパターンを使用し、FizzBuzzGameをnewしてplayFizzBuzzを実行するだけ。
FizzBuzzGameクラスでは1〜50までループし、Strategyインターフェースのcallを実行するだけ

リスト2
public class Game {
    public static void main(String[] args) {
        new FizzBuzzGame().playFizzBuzz();
    }
}


public class FizzBuzzGame {
    public void playFizzBuzz() {
        for (int i = 1; i < 50; i++) {
            Strategy st = StrategyFactory.getStrategy(i);
            st.call();
        }
    }
}

ファクトリークラスでは、
「Fizz」「Buzz」「FizzBuzz」「数字」を出力するStrategyクラスのインスタンスを作成して返す。

リスト3
public interface Strategy {
    public void call();
}

public class Fizz implements Strategy {
    @Override
    public void call() {
        System.out.println("Fizz");
    }
}

public class Buzz implements Strategy {
    @Override
    public void call() {
        System.out.println("Buzz");
    }
}

public class FizzBuzz implements Strategy {
    @Override
    public void call() {
        System.out.println("FizzBuzz");
    }
}

public class NotFizzBuzz implements Strategy {
    int i;
    public NotFizzBuzz(int i) {
        this.i = i;
    }
    @Override
    public void call() {
        System.out.println(i);
    }
}

public class StrategyFactory {
    public static Strategy getStrategy(int i) {
        Strategy st = null;
        if (i % 3 == 0 && i % 5 == 0) {
            st = new FizzBuzz();
        } else if (i % 5 == 0) {
            st = new Buzz();
        } else if (i % 3 == 0) {
            st = new Fizz();
        } else {
            st = new NotFizzBuzz(i);
        }
        return st;
    }
}

実行すると期待通りの結果に。

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49

まとめ

Javaの基礎を一通り学んだ初心者の卒業課題にちょうどいいんじゃないかと思った。
ソースコードはGithubで公開中。

16
13
12

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
13