Singleton(シングルトン)は、グローバルな1インスタンスを保証するデザインパターンの1つです。デザインパターンとはオブジェクト指向の部分的なパターンのことで、エンジニアの共通言語として使われることがあります。
解説
シングルトンは、ログ出力、設定クラス、DB接続など、「1つだけあればいい」インスタンスに使われるデザインパターンです。
※Singletonの語源を調べてみると、Single(ひとつ)+ton(接尾辞)であり、tonは言葉を整えるもので特に意味はないらしいので⋯Singleton=「単一の存在」という意味になります。
Singletonは、どこからでもアクセスできるように設計されています。
コンストラクタを private にして、また呼び出す時は new を禁止するなどして、常に同じインスタンスを返すように設計します。これよりインスタンスの一貫性が保たれ、複数のインスタンスが作られないようにしているために、無駄なリソースを使わずに済みます。
ただし、こういった「厳密に1つしかないオブジェクト」が増えすぎると、設計が硬直化しやすいらしく、あまり歓迎されない面もあるため、必要最低限の使用に留めたほうがよさそうです。
※なお個人的には、「途中で変更しない」というルールがチーム内で守られるのであれば、Singletonパターンの厳密なインスタンス管理をしなくても特に困らないのでは?と思うところもあります...とはいえ、DB接続のように、インスタンスが複数できることでトラブルが起きやすい場面があれば、1つしか作られないし変更されないという特性は、”保険”というか安心感を得られる機能をもたらしてくれるのでしょう。
ふと、過去に何度かやらかした記憶がよみがえりました。
なお以下はJavaによるコード例です。
Javaによるコード例
public class Logger { // 唯一のインスタンスを保持する静的フィールド private static Logger instance; // コンストラクタを private にして外部からの new を禁止 private Logger() { System.out.println("Logger initialized"); } // インスタンスを取得するための静的メソッド(遅延初期化) public static Logger getInstance() { if (instance == null) { instance = new Logger(); } return instance; } // ログ出力の例 public void log(String message) { System.out.println("[LOG] " + message); } } public class Main { public static void main(String[] args) { Logger logger1 = Logger.getInstance(); logger1.log("最初のメッセージ"); Logger logger2 = Logger.getInstance(); logger2.log("2番目のメッセージ"); // 同一インスタンスであることを確認 System.out.println(logger1 == logger2); // true } }
## 補足
※個人的にふと思ったことだが、Singletonならぬインスタンス化に制限があり(クラス内にカウンタを持っており、それが加算されていき)常に最小の個数しか生成できないクラスという設計があってもいいのかもしれない。Singletonはそのなかで究極な存在だ。マックスカウンタが1かつ、アクセスがどこからも可能な存在=Singletonという事もできる。
コメント