AbstractFactoryパターンを使って簡単なアプリを作ってみた

abstract-factory-e プログラミング

※当ブログでは商品・サービスのリンク先にプロモーションを含みます。ご了承ください。

デザインパターンの一つ、AbstractFactoryパターンをQtとC++を使って勉強してみました。

実際にアプリを作ってみることで、パターンの使い方を学びたいと思います。

FactoryMethodパターンってのもありますよね

AbstractFactoryパターンとは

インスタンス生成を専門に行うクラスを用意することで、整合性の必要なオブジェクトを間違いなく生成するパターンです。

と、いわれてもいまいちわからないので、実際にサンプルアプリを見てもらった方が早いです。

FactoryMethodパターンと名前が似ていますが、構造は違うものとなります。

クラス図

abstract-factory-diagram
https://ja.wikipedia.org/wiki/Abstract_Factory_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

Clientクラスは、AbstractFactoryを継承したConcreteFactoryクラスを使います。

説明が難しいので、サンプルアプリをみましょう!

作成したアプリ

さまざまなサラダを生成するアプリを作成しました。

とはいっても、2種類のサラダしか作ってません。

コードと実行結果

abst-fact-gif
実行結果

ボタンを押すことで、野菜サラダと冷しゃぶサラダが生成されます。

GitHub - jiji-thecat/dp-bridge
Contribute to jiji-thecat/dp-bridge development by creating an account on GitHub.

コードを分解

では、各クラスの説明をしていきます。

mainwindow.h / mainwindow.cpp

ここでは、UI部分の実装やロジックを入れています。

salad.h / salad.cpp

サラダを作成する抽象クラスです。

factory.h / factory.cpp

サラダの各材料を保持する抽象クラスです。

クラス図でいう、AbstractFactoryクラスになります。

vegetable-salad-factory.h / vegetable-salad-factory.cpp

factory.cppを継承する野菜サラダクラスです。

クラス図でいう、ConcreteFactoryクラスになります。

FactoryMethodパターンとの違い

Factoryとつくパターンにはもう1つ、FactoryMethodパターンというのがあり、以前記事にしています。

では、このパターンとの違いは何でしょうか?

FactoryMethodパターンは、サブクラスのメソッドにインスタンスの生成を任せるパターンでした。

以前作ったFactoryMethodパターンのアプリでは、CatクラスのcreateBowl()関数で器(milk pan)インスタンスを生成しました。

スーパークラスであるCook.cookSoup()関数で、サブクラスのCat.createBowl()関数を呼んでいます。

一方で、AbstractFactoryパターンは、インスタンスの生成を専門に行うクラスを、ぽんぽこぽんぽこ作成することで、確実なインスタンスの生成を行います。

名前は似ているけど、中身は違うねぇ

どういう時に使うのか?

抽象クラスを使いたいケースって、一つのベースから、そのベースを継承した似たようなものを、いっぱい作り出したい時が多いのかなと思うのですが、

まさにこのパターンがそれなのかな、、と思いました。(すみません、伝わりづらくて)

なので、業務でも使える頻度が多いパターンなのかなと思いました。

今までのパターンのなかでは、使い道がわりとイメージしやすいかも

まとめ

AbstractFactoryパターンのアプリを作成してまとめてみました。

ベースクラスがあって、そこから似たような様々なインスタンスを確実に生成したい場合に使えるパターンです。

参考サイト

にほんブログ村に参加しております!よろしければクリックお願いします 🙂

にほんブログ村 IT技術ブログへ
にほんブログ村

コメント

タイトルとURLをコピーしました