デザインパターンの一つ、AbstractFactoryパターンをQtとC++を使って勉強してみました。
実際にアプリを作ってみることで、パターンの使い方を学びたいと思います。

FactoryMethodパターンってのもありますよね
AbstractFactoryパターンとは
インスタンス生成を専門に行うクラスを用意することで、整合性の必要なオブジェクトを間違いなく生成するパターンです。
と、いわれてもいまいちわからないので、実際にサンプルアプリを見てもらった方が早いです。
FactoryMethodパターンと名前が似ていますが、構造は違うものとなります。
クラス図

Clientクラスは、AbstractFactory
を継承したConcreteFactory
クラスを使います。
説明が難しいので、サンプルアプリをみましょう!
作成したアプリ
さまざまなサラダを生成するアプリを作成しました。

とはいっても、2種類のサラダしか作ってません。
コードと実行結果

ボタンを押すことで、野菜サラダと冷しゃぶサラダが生成されます。
コードを分解
では、各クラスの説明をしていきます。
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パターンのアプリを作成してまとめてみました。
ベースクラスがあって、そこから似たような様々なインスタンスを確実に生成したい場合に使えるパターンです。
他のデザインパターンについてはこちらをご覧ください。
参考サイト

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

にほんブログ村
コメント