オブジェクト指向 ・ Chapter 16
SingletonとFactory
記事 ・ 冒頭を無料公開中
この章でやること
パターン実装の1章目は生成系の2つです。生成系とは、一言でいえば「newの仕方を工夫する」パターン群です。
・ Singleton: アプリ全体で「1つだけ」を保証する
・ Factory: newを1箇所に集めて、作り分けを隠す
どちらも、new を無計画に書き散らすと起きる問題への答えです。
Singleton: 「1つだけ」を保証したい
アプリの中には、2つあったら困るものがあります。たとえばアプリ全体の設定、ログの収集係、DBへの接続管理。こういうものが複数インスタンス化されると、どうなるか。ログ収集係で体験してみましょう。最後の行で何が表示されるか、予想してから実行してください。
2 と 1。チャプター2でやった「インスタンスは独立している」が、ここでは裏目に出ています。ログは全部で3件あるのに、どちらのLoggerも全体を知らない。「今日のエラー全部見せて」に答えられる人がいなくなりました。
Singletonパターンは、クラス自身に「自分のインスタンスは1つしか作らせない」仕組みを持たせます。実装には、初登場のキーワード static を使います。
今度は 3、3、そして true 。loggerAとloggerBは同一のインスタンスです。仕掛けは3点セットです。
| 部品 | 役割 |
|---|---|
| private constructor() | クラスの外から new Logger() を型エラーにする(作る手段を封じる) |
| private static instance | 唯一のインスタンスの保管場所 |
| static getInstance() | 外に公開する唯一の入手経路。初回だけ作り、以降は使い回す |
static が初登場なので説明します。staticの付いたプロパティ・メソッドは、インスタンスではなくクラスそのものに属します。logger.getInstance() ではなく Logger.getInstance() と、クラス名から直接呼ぶ。インスタンスが存在する前に「入手窓口」が必要なので、窓口はクラス側に置くしかない、という理屈です。
Singletonの注意書き(重要)
このチャプターの続きは受講生限定です
本文の残り、図解・実行できるコードブロック・演習はプラン加入後に読めます。