Index
参考書には以下のように記載されています。
インスタンスが1個しか存在いないことを保証するパターンをsingletonパターンと言います。
- インスタンスが1個しか存在しないことを保証することができる
今回クラス図は特にありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.util.Arrays; import java.util.List; public class FruitsMaker { private final List<String> fruitsList = Arrays.asList("バナナ","リンゴ","ミカン","モモ","ナシ"); int num = 0; private static FruitsMaker singleton = new FruitsMaker(); private FruitsMaker() { System.out.println("初期化"); } public static FruitsMaker getInstance() { return singleton; } public synchronized String getNextFruits() { if(num >= fruitsList.size()){ num = 0; } return fruitsList.get(num++); } } |
singletonになるクラスです。
コンストラクタをprivateにすることでプログラマーが勝手にnewすることを防いでいます。
singletonクラス唯一インスタンスを得るメソッドとしてgetInstanceが用意されています。
synchronize 修飾子はマルチスレッド環境で正しく動作させるために必要です。
1 2 3 4 5 6 7 8 9 10 |
public class Main { public static void main(String[] args) { System.out.println("start."); for(int i = 0; i < 10 ; i++) { System.out.println(FruitsMaker.getInstance().getNextFruits()); } System.out.println("end."); } } |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
start. 初期化 バナナ リンゴ ミカン モモ ナシ バナナ リンゴ ミカン モモ ナシ end. |
①インスタンスが1個しか存在しないことを保証することができる
もしインスタンスが複数存在してしまったら、getNextFruitsで帰ってくる値が予測できません。
バナナ→バナナみたいな感じで出力されてしまうかもしれません。
このように制約をつけることによって、プログラミングしやすくなるメリットがあります。
出力を見てください。
start.の後にインスタンスが生成されていることがわかります。
これは最初にgetInstanceした際にコンストラクタが呼ばれていることを意味しています。