はじめに
自分が勉強し、Androidなど実務でやって、とてもためになったデザインパターンについて書こうと思います。
デザインパターンについて
まずデザインパターンとは、オブジェクト指向における、よく利用される設計のパターン
になります。
設計パターンというと少し難しそうですが、僕は クラス同士の協調関係などでよく利用される作り方をパターン化したもの
と捉えています。
GoFが有名で、デザインパターンでググるとたくさん出てきますが、ここでは実際にデザインパターンが使われているAndroidのライブラリをみてみます。具体例を見ることでよりデザインパターンの理解が深まるはず。。!
デザインパターンの一つであるFactory Methodパターンが利用されている、Mobile VisionAPIを見ていきます。
事前の知識
- クラス図とオブジェクト指向についての知識が必要です。ただし、ゴリゴリのそんなに深い知識はいりません。スーパークラスとそのサブクラス(継承)なんかがわかっていればおKだと思います。
Mobile VisionAPIについて
ざざっとこのAPIの説明をすると、
顔や、テキスト、バーコード検出用のAPIになります。
バーコードリーダーの実装はとても便利です。Zxingというライブラリも有名ですが、こちらは同時に複数検出できるという利点があります。
(今はMLKitに取り込まれているようです。)
利用例
ここのドキュメントを見ていきます。
顔やバーコードを認識し、トラッキングしてカメラのプレビュー画面に表示するようなことができます。
googleのサンプル例が公開されており、実際にビルドしてみるとこのように認識することができます。
実装の流れ
上記のドキュメントにある、この図にも書いていますが、簡単に流れを説明します。
AndroidのCameraAPIからimageが流れてきたものを、(ここは図には書いてないが、そうなっている。コマ撮りが次々送られてくる感じ)
BarcodeDetectorがBarcodeを認識するごとに、MultiProcessorに渡され、
MultiProcessorがBarcodeTrackerFactoryクラスを利用し、それぞれの読み取った項目ごとにBarcodeGraphicTrackerを作るという流れになっています。
作成されたBarcodeGraphicTrackerが、この読み取ったQRコードのライフサイクルを管理してくれます。
出てくるデザインパターンの考察
上記は具体的なクラス間についての説明になっていますが、スーパークラスとサブクラスの関係は次のようになっています。
ここで、必要のないフィールドやメソッドは省略しています。
スーパークラスの関係(Framework部分)を見ると、MultiProcessor.Factoryクラス(インターフェース)がcreate()メソッドによって、Trackerクラスを作成しています。
ここで、create()は抽象的なメソッドで記述され、Itemが渡されたらそこからTrackerクラスを作ることがわかります。
newを使った具体的なクラス名によるインスタンスを持つことなく、インスタンス化する抽象的なcreate()メソッドのみを提供しています。create()は抽象的なメソッドで、サブクラスで肉付け(実装される)ことを期待しています。
このスーパークラス同士の関係性の枠組み
を与えることにより、「Trackerのサブクラス(BarcordeTrackerやFaceTracker)を作るよ。」という、ある程度の強制力をもたせることができています。どんな具体的なTracker(顔やバーコードと認識した物体を追跡するクラスなど)でもこの枠組みを再利用することでインスタンスを作ることができます。まるで製品を作る工場のパイプラインを設計しているようなのでFactory Methodパターンと呼ばれています。
このFactory Methodパターンを知っているか知っていないかでドキュメントやサンプルの読み方も変わってきます。
Factory Methodパターンを知っている人は、
- 「ああ、あるクラスのインスタンスの作り方を規定してるのね。」
- 「具体的なクラスは何を作ってるんだろう。複数の具体的なFactoryが作れるはずだ」
- 「BarcodeTrackerFacotryっていうサブクラスが出てきたけど、スーパークラスをみることでどんなクラスを作るFactoryなのかわかるはずだ。」
といったことが予想できます。
まとめ
その他、SingltonやBuilderパターンといったものは本当によく出てくるので、知っているだけでドキュメントの読み方や、コードの読み方が変わりますので、覚えておいて損はないと思います。