デザインパターンとは、システム設計におけるクラスやインターフェースの関係に名前をつけたものです。 GoFの23のパターンが有名です。デザインパターンというのは、どんなパターンなのか、パターンの目的は何かということを覚えることが非常に重要なのですが、これを実際に適用しようとした場合に、いつ適用していいかが見えてこないとお話になりません。
そこで、自分の勉強も兼ねつつ、パターンの実践時における使用場所や、パターンを適用するきっかけを見つけられるようにメモしておきます。
13番目は唯一性を保証するSingletonパターンとは別の方法であるMonostateパターンのメモです。
Monostateパターン
Monostateパターンは、それぞれのインスタンスが状態をあたかも一つしか持っていないように振る舞うパターンです。
Monostateクラスである条件は、すべてのインスタンスで振る舞いが同じであればよいのです。実装はいたって簡単で、すべての変数をstaticにするだけです。メソッドはすべてstaticではないことに注意してください。
Monostateとは、たった一つの状態のみを持つというもので、どのインスタンスオブジェクトも同じ振る舞いを行います。Singletonパターンとは、「構造」と「振る舞い」のどちらに視点を置いているかが違うだけです。
Singletonパターンは、「構造」に着目しています。インスタンスをたった一つしか作らせない「構造」になっているからです。逆に、Singletonパターンを実装する場合は、必ずインスタンスが一つになるような構造にしておかなければなりません。
Monostateパターンは、「振る舞い」に着目しています。インスタンスを生成する方法に制約はなく、あくまでオブジェクトの「振る舞い」がどのインスタンスにおいても同じであるということを規制します。
SingletonパターンとMonostateパターンは非常に似通っていながら、少し違いがあります。Monostateクラスに対するテストケースは、Singletonクラスに適用できます。しかし、Singletonクラスのテストケースは、必ずしもすべてMonostateクラスに適用できない場合があります。Singletonクラスは常に同じインスタンスを返すのに対して、Monostateクラスはインスタンスはそれぞれ異なり振る舞いだけが同一のインスタンスになるからです。
SingletonクラスとMonostateクラスの主な相違点
Singleton
- 継承できない
- Singletonクラスから派生されるクラスは、必ずしもSingletonにならない。派生クラスをSingletonとして機能させたければ、適切なインスタンス変数とstaticメソッドを用意する必要がある。
Monostate
- 継承できる
- Monostateクラスの派生クラスはMonostateクラスになる。親クラスのすべての変数を共有できます。
- ポリモーフィズム可能
- Monostateのメソッドはstaticではないので、派生クラスの中でオーバーライドできます。Singletonクラスでは、そもそもインスタンスが一つしかないので、ポリモーフィズムにならない。
パターンの適用タイミング
SingletonパターンとMonostateパターンの適用するタイミングは、以下のような場合です。Singletonパターンを導入するのは、「構造」の観点からインスタンスを一つに制限したい場合、Monostateパターンを導入するのは、「振る舞い」の観点からインスタンスを制限したい場合
SingletonパターンとMonostateパターンはどちらも、オブジェクトの唯一性を保証する場合に使うことができます。その中でも、Monostateパターンは、ポリモーフィズムを利用したい場合に使うことができます。
実装サンプルと参考文献
SingletonパターンとMonostateパターン ジャズと育児とオブジェクト
Monostate デザインパターン紹介
デザインパターンのお勧め書籍
- 独習シリーズのデザインパターン編。デザインパターンを一人でも学べます。
- Sun Microsystemのお墨付き。GoF以外のパターンも学べます。
- UMLを使って、オブジェクト指向のいいとこ取りができます。
- デザインパターンだけではなく、ソフトウェア設計の原則やプラクティスまで学びたい人におすすめ