LoginSignup
48

More than 3 years have passed since last update.

Singletonパターンはどのようなときに使うのか?

Last updated at Posted at 2016-06-13

Singletonパターンは、基本的には「使用非推奨」

Singletonパターンは、基本的には「使用非推奨」です。

次のうちどれか 1つにでも当てはまる場合は、Singleton で は な い と思います。

  • setter が1つ以上存在する
    • ≒ public な変数が存在する
  • コンストラクタが1つ以上の引数を持っている
  • 初期化され得る
    • 「初期状態」と「非初期状態」が存在するので、ダメ。
  • 副作用のあるメソッドが1つ以上ある
    • ファイルへのI/O
    • 標準入出力の使用
    • ネットワーク経由でのデータの送受信
    • DB への CRUD 操作
    • 乱数を使っている
    • システムの時刻を参照している
    • その他、その Singleton クラスから外の情報に依存した処理

Singletonが使えるとき

以下の条件をすべて満たすクラスは、Singleton にしても良いかもしれません。

  • 別のクラスを継承したり、インターフェースを実装したりする
    • もしくは、継承される
  • 属性は ない
    • コンストラクタは引数が ない
    • Setterが1つも存在し ない
  • staticなメソッドのみ ではない

こんな条件を満たせるクラス、そう滅多にないでしょう。

使うべきタイミング

『オブジェクト指向における再利用のためのデザインパターン』

『オブジェクト指向における再利用のためのデザインパターン』P.144 によると、Singletonパターンに関係するパターンは、以下の3つだそうです。

  • Abstract Factory パターン
  • Builder パターン
  • Property パターン

Abstract Factoryパターン

『オブジェクト指向における再利用のためのデザインパターン』P.98 によると、

Abstract Factoryパターンを実装するために、次のような役に立つテクニツクがある。
1. Singletonパターンを利附する。典型的なアプリケーションでは、部品の集合ごとにConcreteFactoryクラスのインスタンスを1つしか必要としない。したがって、通常ではConcreteFactoryクラスをSingletonパターンを使って実装することが最良の方法になる。

らしいです。

Builderパターン

『オブジェクト指向における再利用のためのデザインパターン』P.114 には、

Abstract Factoryパターン(p.95) このパターンは、複合オブジェクトを作成するという点でBuilderパターンに類似している。主な違いは、Builderパターンでは複合オブジェクトを段階的に作成していく過程に焦点をあてているのに対して、AbstractFactoryパターンでは部品の集合を強調している(それが単純で、あっても複雑であっても)という点である。Builderパターンでは、Productオブジェクトを最終段階で返すことになるが、AbstractFactoryパターンでは即座に返す。

と書かれています。
Buidler パターンの方にはは書かれていませんが、 Factory系であることには変わりないので、同じ理由で「最良の方法になる」 のでしょう。

Propertyパターン

cloneされる元のConcrete Prototypeは、状態を持たない(もしくは、初期状態から変化しない)から、Singleton"でも"良い、ということでしょうか。

しかし、

3.複製の初期化を行う(『オブジェクト指向における再利用のためのデザインパターン』P.132)

とあり、「非初期状態」の Concrete Prototype オブジェクトというのもありそうです。
この場合は、Singleton にはしないほうが懸命でしょう。

シングルトンの賢い使用法(の「本当にシングルトンである場合」)

この記事によると、以下の条件をすべて満たす場合は、Singletonらしいです。

  • すべてのアプリケーションは、まったく同一の方法でこのクラスを使用するか? (「まったく」がキーワード)
  • すべてのアプリケーションは、常にこのクラスの1つのインスタンスのみを必要とするか? (「常に 」と「1つの」がキーワード)
    • 「インスタンスが2つ以上あると困る」ということだと思う
  • このクラスのクライアントは、自分自身がその一部に含まれているアプリケーションを意識しないべきか?

Singleton パターンの使いどころをまとめてみた

「生きている」と「非生きている(=死んでいる)」の2つの状態があるだろって思ったけど、それは「インスタンスが存在するかどうか」なので、大丈夫です。たぶん。

要するに、以下の条件をすべて満たす場合は、Singletonにしても良い、ということでしょう。

  • 継承したりされたりする
  • 属性(メンバ変数とかプロパティとかフィールドとか言うアレ)が存在しない

参考文献

オブジェクト指向における再利用のためのデザインパターン
Singleton パターンの使いどころをまとめてみた
Singleton何が悪いの?
シングルトンの賢い使用法

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48