お久しぶりです。白々です。
先日エンジニアの先輩にデザインパターンをご存知でない!?という冷静なツッコミを頂き、その後結城浩さんが書かれた「Java言語で学ぶデザインパターン入門」を渡されたので勉強することにしました。
ただ、本を一読しても覚えられないので覚書として記事にしようと思いました。
今回で4回目です。
完走できるように頑張ります。
また、「Java言語で学ぶデザインパターン入門」には、サンプルプログラムも有りますが、著作権の都合上省かせて頂きます。御了承ください。
前回は、「Template Methodパターン」に関しての記事を作成しました。
前回の記事は、以下です。
https://qiita.com/sirajirasajiki/items/53e1d2aea166190f9a6f
今回は、「Factory Methodパターン」に関して記載したいと思います。
また、「Factory Methodパターン」には、サンプルプログラムも有りますが、著作権の都合上省かせて頂きます。御了承ください。
#第4章 Factory Method-インスタンス作成をサブクラスに任せる
「Java言語で学ぶデザインパターン入門」には、
Factory Methodは、簡単にいうとTemplate Methodパターンをインスタンス生成に適用した物
だそうです。
イメージしにくい人もいると思うので、例を記載します。
工場を思い浮かべてみてください。
工場では、製品が作成されています。
しまむらやユニクロなどの大手のチェーン店では、Tシャツ大体工場とかで作成されていることが多いですよね?
大きさは、大体Sサイズならこれくらい、Mサイズならこれくらいとサイズごとに大体大きさが決まっていると思います。
しかし、材質や、デザインは、企業によって異なると思います。
工場では他にも、パソコン等も作成されていると思います。
パソコンだったら、メモリは16GBでSSDかHDDかみたいに分かれていくと思います。
このように、工場内で何を作っても製品ですよね?
工場で何かを作ることをスーパークラスとすると、Tシャツ工場は、サブクラスとなります。
しかし、パソコン工場というサブクラスも作ることができます。
抽象化したクラスを使うことで共通の概念を持った全く違うサブクラスを作成することができます。
このように、インスタンスをどのように作成するかをスーパークラス側で決めておき、具体的な処理をインスタンスに任せることによってインスタンスの生成の枠組みとインスタンスの生成とを分けて考えることができます。
また、具体的な処理をインスタンスに任せることによって、スーパークラスは、インスタンスに依存しない状況が作れます。
##Factory Methodを使う時の注意事項
「Factory Methodパターン」で作成したサブクラスは、スーパークラスにインスタンスの作り方を決められます。
なので、スーパークラスをちゃんと理解する必要があります。
##Factory Methodを使った例
「Java言語で学ぶデザインパターン入門」にもあった工場の例を使ってクラス図とPythonのコードを作成します。
今回は、工場クラスと製品クラスを作成し、それぞれを継承したパソコン工場クラスとパソコンクラスを作成します。
工場クラスには、製品を作成する「createProduct」という抽象メソッドと、作成した製品を登録する「registerProduct」という抽象メソッドが宣言されており、この2つの抽象クラスはサブクラスで実装します。また、「create」という「createProduct」を使って製品を作成し、「registerProduct」で製品を登録するという流れを実装したメソッドがあります。
パソコン工場クラスは、工場クラスを継承し、「registerProduct」と「createProduct」を実装し、どの人が購入したのかを示す「get_owners」というメソッドを継承しています。
製品クラスには、作成された製品を使う「use」という抽象メソッドのみ実装されています。
パソコンクラスは、製品クラスを継承し、「use」を実装し、自身のインスタンスを作成するメソッドと、誰に送るのかを取得する「get_owner」メソッドが実装されています。実際に実装する場合は、送り先や、法人か個人か、パソコンのスペック等を取得したり登録できたりするべきではありますが、今回はFactory Methodを使った例なので、行いません。
このクラス図は、PlantUMLというもので記載しています。
私が、書いたPlantUMLのコードは以下のGitHubに記載がありますのでReadMeを読んでお使いください。
factory_method.txtです。
https://github.com/sirajirasajiki/design_pattern_uml/tree/master/template_method
PlantUMLのインストール方法と使い方に関しては、後述のappendixに記載しています。
###クラス図を元にPythonで実装
以下に実装したコードを公開しています。Python 3.7で実装しました。
https://github.com/sirajirasajiki/design_pattern_python/tree/master/FactoryMethod
#まとめ
スーパークラスでインスタンスをどのように作成するかを決め、サブクラスで具体的な処理を記載する「Factory Methodパターン」について学びました。
#第4章感想
Factory Methodパターンだけなく、基本的にパターンを使うときは、スーパークラスをちゃんと理解する必要があると思いました。
なので、スーパークラスにはどのような意味なのかをコメントで書こうと思います。
説明で使った例は、後日Pythonで実装しようと思います。
Pythonで実装しました。
#最後に
何か間違っているところがあれば、ご指摘していただけると嬉しいです!
#appendix
##次回の記事
https://qiita.com/sirajirasajiki/items/532d33fd823e52ab0d1a
##PlantUMLに関するサイト
PlantUMLのインストールの時にお世話になったサイトは以下です。
https://qiita.com/kohashi/items/1d2c6e859eeac72ed926
PlantUMLを書くときにお世話になっているサイトは以下です。
https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48