オブジェクト指向 ・ 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の注意書き(重要)

このチャプターの続きは受講生限定です

本文の残り、図解・実行できるコードブロック・演習はプラン加入後に読めます。

料金プランを見る