のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

DesignPattern FactoryMethod

Sponsored Links

皆さんこんにちは
お元気ですか?家熱すぎわろたみたいなハートを持っています。

さて、本日はDesignPatternのFactoryMethodについて

FactoryMethodとは?

工場クラスを通じて、オブジェクトを返します。
このことにより内部の実装は気にせず、外部からメンバ関数メソッド)にアクセスをすることができます。
つまり、実際のインスタンスを知らずに操作ができますね。

よく使われるケースでは、同じオブジェクトの内部をとっかえひっかえできることです。
変更箇所も一箇所ですみますね。

FactoryMethodの利点

①変更箇所が一箇所で済む
②内部を知らずに操作ができる。抽象的にコードを考えることができる

FactoryMethodの欠点

①新しいメソッドを増やすと面倒になります。

クラス図

f:id:tereka:20140614160727p:plain

ソースコード

返すオブジェクトは同じ名前のメンバ関数を指定するようにしてください。

#include <iostream>

using namespace std;

class Math{
public:
	virtual double calc(double a,double b) = 0;
};

class Add:public Math{
public:
	double calc(double a,double b){
		return a + b;
	}
};

class Diff:public Math{
public:
	double calc(double a,double b){
		return a - b;
	}
};

class MathFactory{
public:
	Math* createMath(int id){
		if(id == 0){
			return new Add();
		}else{
			return new Diff();
		}
	}
};

int main(int argc, char const *argv[]){
	MathFactory *mathfactory;
	Math *math = mathfactory->createMath(0);
	cout << math->calc(10, 20) << endl;
	math = mathfactory->createMath(1);
	cout << math->calc(10, 20) << endl;
	return 0;
}

MathFactoryからMath classのオブジェクトを返し、それをmain関数内で操作しています。
取り替える時も、mathfactoryから呼び出している関数の内容を変更するだけで、操作ができています。

例えば・・・・クラスタリングアルゴリズムみたいに、流れが同じものだけど、沢山のアルゴリズムを実装する時に、この手法だと変更する箇所は原則一緒になりますね。

素晴らしきかなFactoryMethod,あれ、Strategy Patternと何が違うんだ…。まだまだ勉強が必要です。