ソフトウェアでは、オブジェクトの作成と使用を分離する必要がある場合があり、その場合、単純なファクトリパターンが必要になります。
1.単純なファクトリパターンの3つの役割
1)ファクトリの役割:すべてのインスタンスを作成する内部ロジックの実装を担当する、単純なファクトリパターンのコア。ファクトリクラスを外部から直接呼び出して、必要な製品オブジェクトを作成できます。
2)抽象製品(AbstractProduct)の役割:単純なファクトリパターンによって作成されたすべてのオブジェクトの親クラス。すべてのインスタンスで共有される共通のインターフェイスを記述します。
3)具体的な製品の役割:単純なファクトリモデルによって作成された具体的なインスタンスオブジェクト。
2.適用可能なシナリオ
1)ファクトリクラスは、作成するオブジェクトの数を減らします。作成されるオブジェクトの数が少ないため、ファクトリメソッドのビジネスロジックはそれほど複雑になりません。
2)クライアントは、ファクトリクラスに渡されたパラメータのみを認識しており、オブジェクトの作成方法を気にしません。
3.ファクトリモデルの
長所と短所1)長所
1.1)オブジェクトの作成と使用の分離を実現します
。1.2)特定のクラス名を覚える必要はなく、パラメータを覚えるだけで、ユーザーのメモリ負荷が軽減されます。
2)デメリット:
2.1)ファクトリーカテゴリに対する過度の責任、機能しなくなるとシステムに影響が及ぶ;
2.2)システム内のカテゴリの数を増やし、複雑さと理解を高める;
2.3)「オープンとクローズの原則」に違反し、新製品を追加するファクトリロジックを変更する必要があり、ファクトリはますます複雑になっています。
4、ケース
4.1オリジナルデザインver1.1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
class Fruit
{
public:
Fruit(string kind){
if (this->kind == "apple")
{
}
else if (this->kind == "banana")
{
}
}
void getName(){
if (this->kind == "apple")
{
cout << "I am apple" << endl;
}
else if (this->kind == "banana")
{
cout << "I am banana" << endl;
}
}
private:
string kind; //水果的种类
};
//工厂模式的目的,就是让业务层和类的构造函数之间解耦合,
//尽量降低一个类的复杂度
int main(void)
{
//要一个苹果
Fruit apple("apple");
apple.getName();
Fruit banana("banana");
banana.getName();
return 0;
}
4.2)シンプルファクトリモードが追加されたver1.2の設計
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
//水果类
class Fruit
{
public:
virtual void getName() = 0;
};
class Apple :public Fruit
{
public:
virtual void getName(){
cout << "apple..." << endl;
}
};
class Banana :public Fruit
{
public:
virtual void getName(){
cout << "banana..." << endl;
}
};
//一个工厂
class Factory
{
public:
//水果的生产器
Fruit* createFruit(string kind){
if (kind == "apple")
{
return new Apple;
}
else if (kind == "banana")
{
return new Banana;
}
}
};
int main(void)
{
Factory *factory = new Factory;
//要一个苹果
Fruit *apple = factory->createFruit("apple");
apple->getName();
//要香蕉
Fruit *banana = factory->createFruit("banana");
banana->getName();
return 0;
}
バージョンver1.2は、ver1.1コードよりも優れた保守性とスケーラビリティを備えています。