AdapterパターンとFactory Methodパターンの事例

デザインパターンでフレームワークをラップする 前回はObserverパターンの事例を紹介しました。Observerパターンは、オブジェクトの状態の変化に応じてほかのオブジェクトに何らかの通知を行うパターンです。また、何らかの通知によってオブジェクト同士が強く依存してしまうことを避けたい場合や、通知

中川 三千雄

2009年5月15日 20:00

デザインパターンでフレームワークをラップする

 前回はObserverパターンの事例を紹介しました。Observerパターンは、オブジェクトの状態の変化に応じてほかのオブジェクトに何らかの通知を行うパターンです。また、何らかの通知によってオブジェクト同士が強く依存してしまうことを避けたい場合や、通知するオブジェクトを1つに特定したくない場合に有効です。

 今回はcommons logging 1.1.1(http://commons.apache.org/logging/)を事例に、GoFのデザインパターンであるAdapterパターンとFactory Methodパターンを取り上げます。

 Adapterパターン(図1-1)は構造に分類されるパターンです。Adapterとは「適合させるもの」という意味です。互換性のないさまざまなインターフェースを持つクラス(Adaptee役)に修正を加えることなく、利用者が望むインターフェース(Target役)で利用できるようにAdapter役が変換します。Adaptee役を包み込むような形になることからラッパー(Wrapper)と呼ぶこともあります。Adapterパターンは、「継承」と「委譲」の2種類の実現方法がありますが、今回は「委譲」で説明します。

 Factory Methodパターン(図1-2)は生成に分類されるパターンです。Factoryとは「工場」という意味ですので、何かを作ったり加工したりすることを連想するかもしれませんが、このパターンはCreator役のクラスのcreateメソッド(ファクトリーメソッド)からProduct役のインスタンスを生成することを定めます。ただし、具体的なインスタンス生成はCreator役のサブクラスであるConcreteCreator役のクラスに委ねます。

 このパターンはインスタンスを生成するための仕組みとインスタンスを決定するための仕組みを分けて考えることができます。ちなみにCreator役のクラスのファクトリーメソッドは、第1回(http://thinkit.co.jp/article/925/1/)で紹介したTemplate Methodパターンを応用することが多いです。

 commons loggingは、AdapterパターンとFactory Methodパターンによってlog4jのAPIやJDK 1.4以降のLogging API(以降、JDK Logging APIと略す)などの異なるロギングフレームワークを簡単に切り替えて使うことができる、汎用的なロギングAPIです。

 今回はcommons loggingの中で、どのようにパターンが適用されているのか、どのような効果があるのかを分析して理解を深めていきましょう。

ログ出力を行うソースコードはロギングフレームワークに依存する

 ロギングフレームワークの中ではThe Apache Software Foundationのlog4jが有名ですが、ほかにもいくつか存在しています。ロギングフレームワークはファイルやネットワークなどに対してログを出力する仕組みを提供してくれます。利用するフレームワークによって異なりますが、出力先や出力するログレベルを設定ファイルで細かく操作することができます。

 システム開発では、運用やデバッグの目的でログ出力を行う必要が出てきます。ログ出力を行うソースコードはロギングフレームワークに依存します。何らかの理由でlog4jからJDK Logging APIに切り替える場合、ソースコードに手を加える必要があります。

 また、プレゼンテーションレイヤーや永続化レイヤーの汎用的なフレームワークを開発する場合では、利用するロギングフレームワークをあらかじめ決めたくはありません。なぜなら、そのフレームワークの利用者がロギングフレームワークを選択できなくなるからです。

 もっとも良いのは、ロギングフレームワークを自由に変更できるようにすることです。そのためにはロギングフレームワークに依存しないログ出力のプログラミングを行う必要があります。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30