14:00Singletonはおそらく最も非難されているソフトウェアデザインパターンでしょう。本稿では、Singleton構造が抱える問題点、およびその対処方法について考えていきます。目次Page1Singletonパターンの例Page2Singletonパターンの例Singletonはおそらく最も非難されているソフトウェアデザインパターンでしょう。その点では、開発者たちから複雑すぎるとけなされることの多いVisitorパターンといい勝負です。Singletonのベースにある考え方は単純で、アプリケーションの実行中に特定の型のインスタンスが1つしか存在しないことを保証する、というものです。Javaのデフォルト動作では(他の大部分の言語でも同じですが)、クラスのインスタンスはいくつでも作成できます。5まで、Javaにはインスタンスの数を制限する直接的な方法はありませんでした。5以降のバージョンでは、enum構造を使って特定の型のオブジェクトの数を制限することができます。既知のインスタンスそれぞれに一意の名前を付けることもできます。CやC++などの言語では、enum(列挙)は単なる一連の整数値であり、その中の各要素が一意のシンボルに対応します。enumを使用することで、より表現力のあるコードを作成することができます。Javaでは、enumは他のクラスと同じように見えますが、重要な違いがいくつかあります。enumはコンストラクタ、メソッド、およびフィールドを持つことができますが、サブクラス化することはできません。enum定義では、既知のインスタンスの名前を最初に指定します。その他のインスタンスはどんな方法を使っても作成できません。単純に考えると、Singletonパターンの候補としては、図書館システム内のカタログなどが思い浮かびます。どの本がどのカタログに追加されたのかわからないという状況は望ましくないからです。リスト1は、enum構造を使ってSingletonのカタログを実装する例を示しています。}}それほど難しいものではありませんね。クライアントコードは既知の単一オブジェクトsoleInstanceを指していなければなりません(リスト2を参照)。compile!コメントに書かれているように、コードをコンパイルすることさえできません。デザインパターンらしく見えないかもしれませんが、これは確かにデザインパターンの実装であり、このおかげでJava言語は大きく単純化されています。開発者は、おそらく自己完結型のSingletonの概念の方になじみがあることでしょう。Javaでは、これはstaticな作成メソッドを用意し、コンストラクタをprivateにすることを意味します。}}プライベートなコンストラクタにより、他のクライアントがCatalogオブジェクトを作成できないことが保証されます。クライアントの観点からすると、それほど違っているようには見えません(リスト4を参照)。}}この単純で無害そうに見えるパターンが、いったいどういう理由で非難されているのでしょうか。Singletonはグローバル変数をオブジェクト指向の言葉で表したものにすぎません。ソフトウェア開発コミュニティは、グローバル変数によって引き起こされる問題をずっと前から認識していました。最大の問題は、グローバル変数はアプリケーション全体に緊密な結合を持ち込むということです。検討してほしいのは、本当にグローバル変数やSingletonを使う必要があるのかという点です。Singletonにしようと思っていたクラスのインスタンスを複数作成した場合、実際にどんな害があるのでしょうか。代わりに複数のインスタンスを許すように設計を変えたらどうなるでしょうか。意味論から言えば、現実にはマスタカタログは1つしかありません。booksハッシュマップをstaticなフィールドとしてカプセル化するCatalogクラスを設計することは可能です。この場合、クライアントは必要に応じてCatalogインスタンスを複数作成できますが、それらはすべて同じstaticフィールドを指します(ちなみに、これはMonostateと呼ばれているパターンです)。1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。Langr)本格的なソフトウェアの開発に四半世紀以上携わってきたベテランのソフトウェア開発者。Hall、2005年)と、他の1冊の著書がある。圧縮・解凍UNIX基本講座@CodeZine『CodeZine(コードジン)』の公式アカウントです。【NEW】デブスト2019デブサミ2019福岡・関西デブサミ2019夏デブスト関西デブサミ2019×ログインEメールパスワード※旧SEメンバーシップ会員の方は、同じ登録情報(Eメール&パスワード)でログインいただけます。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。