NullObjectパターン
GoF以外のデザインパターン
GoFの示した23のデザインパターンは、目的別に生成、構造、振る舞い、適用範囲として、クラス、オブジェクトに分類されて整理されています。それぞれのデザインパターンは基本的なパターンを示しており、実際は、ある1つのパターンを利用するだけでなく、複数のパターンを組み合わせて協調して利用されることが多いです。
GoF以外のデザインパターンも同様に、生成、構造、振る舞いの目的別に分類することができます。これらに加えて、マルチスレッドのためのデザインパターンがあります。GoFのデザインパターンは主にsmalltalk時代の実装で使用されてきたパターンを整理したものです。このGoFのパターンは、JavaやC#の場合でも有効です。
しかし、JavaやC#のような新しい言語、環境に応じてほかのパターンが有効だったり、新たなパターンが必要になったりした結果、GoF以外のデザインパターンも語られるようになってきたということもできます。
実際、GoF以外のデザインパターンは、JavaやC#のライブラリやフレームワークなどに使用されているものが多いと言えます。また、JavaやC#の環境では、Webアプリケーションに代表される、マルチスレッドのプログラムを記述する機会が多く、マルチスレッドに対するパターンも多く登場してきたと言えます。
NullObjectパターン
最初に紹介するのは、NullObjectパターンです(図2)。NullObjectとは、何もしないオブジェクトのことです。何もしないオブジェクトに意味があるのかと思いますが、使い道はいくつかあります。
1つは、JavaやC#において、オブジェクトの参照が存在しない状態(null)の代わりにNullObjectを定義して利用するというパターンです。例えば、メソッドの戻り値やフィールドの値がnullになる可能性がある場合、NullPointerException(javaの場合)やSystem.NullReferenceException(C#の場合)などのエラーが実行時に起こる可能性があります。しかし、nullの変わりに何もしない、NullObjectを定義して用いれば、nullによるエラーが起きる可能性をなくすことができます。
NullObjectの使い道はほかにもあります。例えば、テスト用に取りあえず動かしたいとか、設定がない場合には何もしないといった場合にNullObjectを使うことによって何の動作もしない状態を実現します。
NullObjectパターンを実装する場合には、Singletonパターンと組み合わせて用いられることが多いです。NullObject自身は何もしないので、状態の違いはなくインスタンスは1つあれば十分です。そのため、NullObjectをSingletonとして実装して、インスタンスを1つに限定します。
NullObjectパターンはStrategyパターンと組み合わされることもあります。Strategyパターンは、戦略を切り替える、つまりオブジェクトの振る舞いを切り替えたい場合に用いられますが、その要素の1つとして何もしないNullObjectを用意するといった使い方がされるからです。