デザインパターン・Factory(ファクトリー)パターンの実装

デザインパターン・Factory(ファクトリー)パターンの実装をご紹介します。
Factoryパターンを使用することで、ソースコードの管理がしやすくなり、機能拡張に強い設計ができます。


Factoryパターンとは

Factory(ファクトリー)パターンとは、下位クラスの各オブジェクトの生成を1つのクラス(Factoryクラス)で実施するデザインパターンです。

用途・どんな時に使えるの?

主に以下のメリットを得るために使用します。

  • コード上管理しやすい
  • 機能拡張に強く柔軟に対応できる

Factoryクラスを使わない場合オブジェクトを生成する場所があいまいになり、どこで生成しているのか分からなくなります。Factoryクラスを使えば1つのクラスで管理できるためこの問題は解消されます。ただFactoryクラスで管理するオブジェクトは一貫性があるものが望ましいです。次章で説明します。

クラス図

Factory(ファクトリー)

Factoryクラス設計図です。

contents_factoryクラスのcreateでcontents_a, contents_b, contents_cオブジェクトを生成します。オブジェクトの生成はcontents_factoryクラスだけで意識します。
機能拡張や削除時のコード変更に対してcontents_factoryクラスだけで抑えることができるため、変更工数を少なくすることができます。

またこの設計であれば機能拡張の際に共通部品として抽象クラスを使用することができます。

派生クラスの拡張

contents_frameworkは抽象クラスであり、contents_a, contents_b, contents_cは派生クラスです。

抽象クラスでは共通の処理、派生クラスでは固有の処理をします。
乗り物で例えると以下のようになります。

抽象クラス:乗り物
→ 「移動する」は共通の処理.

派生クラス:自動車、飛行機、電車
→ 「ペダルを漕ぐ」「操縦機を操作する」「ドアを開く」などは固有の処理.

例えば「戦車」が必要になった場合、「戦車」を派生クラスとして拡張します。「戦車」は「乗り物」クラスを継承しているため、「乗り物」の「移動する」を使用することができます。使用者は今まで通り「乗り物」が公開する「移動する」のIFを使用することで「戦車」を使用することができます。

言い換えるとこれは、使用者は抽象クラスのIFの実装を変更することなく今まで通りに抽象クラスのIFを呼ぶだけで拡張した派生クラスを使用することができます。

派生クラスの一貫性

設計上の注意点としては派生クラスの一貫性を考慮する事です。
これがもし自動車・パソコン・リンゴのような一貫性のないオブジェクトを派生クラスとした場合、パソコンが「移動する」のIFを持つことは意味的におかしいため、一貫性のあるオブジェクトを派生クラスとして管理することを推奨します。

実装の解説

C++で実装したサンプルコードの解説をします。
このサンプルコードはmain関数からFactoryパターンよりcontents_a, contents_b, contents_cのオブジェクトを生成し、それぞれコールします。

使用者であるmain関数では、contents_factoryのcreateでポインタを取得します。contents_factoryクラスではnewすることでオブジェクトを生成し、そのポインタを返すようにしています。

その後、抽象クラスであるcontents_frameworkへ設定し、requestします。

contents_frameworkのact_requestは派生クラスの処理を保証させるため、純粋仮想関数で定義します。requestは外部公開用であり、処理の中でact_requestを呼びオーバーライドで派生クラスが呼ばれます。

■ ExFactory.cpp

■ contents_factory.cpp

■ contents_factory.h

■ contents_framework.cpp

■ contents_framework.h

サンプルコード

Visual C++ 2017で作成したサンプルコードをGitHubで公開しています。
GitHub – ExFactory

実行結果は以下の通りです。
生成したcontents_a, contents_b, contents_cのそれぞれのact_requestがコールされていることが確認できます。

[ 15] Start. 
[ 29] Contents A. 
[ 40] Contents B. 
[ 51] Contents C. 
[ 30] Terminate. 

参考

以下のサイトを参考にさせていただきました。
TECHSCORE(テックスコア) – 4. FactoryMethod パターン

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/7/29 21:38時点)

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*

Translate »