まさかのトリです。びっくりしました
今回は、自分の復習も兼ねてSingletonパターンについて書いてみたいと思います。
Singletonパターンって何?
オブジェクト指向プログラミングでのデザインパターンの一つです。デザインパターンとは、プログラミングをするときによく直面する問題と、
その解決策をテンプレート化したものの集まりです。
要するにプログラミングの先輩たちが
「俺たちがよく見る問題をきれいに解決する方法
に名前を付けたから、参考にしてね!」
っていうやつです。
で、Singletonパターンは「インスタンスを一つしか生成したくない!」という問題を解決する
方法を記したパターンです。
方法を元に作ったプログラムはこちらになります。
class Singleton{ private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; } //この後に使いたいメソッドやフィールドを追加していく }
あらかじめinstanceに自分自身を生成しておき、 getInstance()が呼び出されたときに
それを返します。
コンストラクタとinstanceがprivateなので、 getInstance()を使わないとアクセスできないため、
インスタンスを一つしか生成できない形になっています。
Singletonパターンはどう役立つの?
インスタンスを2つ以上生成してもムダが増えるだけの場合や生成時の初期化に時間にかかる場合、
サーバ等のマルチスレッド環境で同じリソースを扱いたい場合
にSingletonパターンを使ってみるといいと思います
しかし、これは個人製作や小規模のプログラムでは必要ないことも多いです。
newを一回しかしないっていうことを守っておけばいいのですから。
なので、特に役立つ場面は
「インスタンスを一つしか生成したくない!」ということを
「このプログラムに携わる人に知ってもらいたい時」
だと思います。
使う時に気を付けることは?
一つだけ、僕が実際にやったミスを紹介します。サーバ構築時に上のプログラムを書き換えて
class Singleton{ private static Singleton instance = null; private Singleton(){//いろいろ結構多め} public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } //いろいろ }
と「このクラスを最初に使う場合だけ生成する」と書き換えました。
そうするとマルチスレッドのため、同時にgetInstance()を実行される場合があり、
結果的にインスタンスが2つ以上作られてしまったというのがありました。
そうなるとシングルトンの意味がないので、使う際には気を付けてください
まとめ
Singletonパターンについて書いていきました。 これにかぎらず、デザインパターンは知っていれば、いざ出くわしたときに「このクラスはこういうことをさせたいんです!」という作った人の意図をスムーズに理解する
ことができると思います。
以上で終わります
ありがとうございました。