ファクトリメソッドパターンは、ファクトリ階層を導入することで、単純なファクトリパターンのファクトリクラスの責任が重すぎるという問題を解決します。ただし、ファクトリメソッドパターンの各ファクトリは1種類の製品しか生成しないため、多数のシステム内のファクトリクラス。システムのオーバーヘッドを増加させることになります。この時点で、いくつかの関連製品を「同じファクトリによって生成される製品ファミリ」に結合することを検討できます。これは、この記事で学習する抽象的なファクトリパターンの基本的な考え方です。
「ファクトリメソッドパターン」マルチリージョンのフルーツクラス図を実現します
。1 。ブドウなどの新製品を追加する場合、コードを変更する必要はありませんが、多数のクラスを追加する必要があり、相対ファクトリも追加する必要があります。 。(システムオーバーヘッド、メンテナンスコスト)
2。同じ地域のFruits(日本、日本、日本)を使用する場合、特定のファクトリを個別に作成する必要があります。選択が間違っていると、混乱が生じます。さらに、コードの実装が複雑になります。
モデルにおける役割と責任
抽象ファクトリ(抽象ファクトリ)の役割:製品ファミリを作成するために使用される一連のメソッドを宣言します。各メソッドは製品に対応します。
コンクリートファクトリ(コンクリートファクトリ)の役割:抽象ファクトリで宣言された製品の作成方法を実装し、コンクリート製品のセットを生成します。これらの製品は製品ファミリを構成し、各製品は特定の製品階層に配置されます。
抽象製品(抽象製品)ロール:各製品のインターフェースを宣言し、抽象製品内の製品のビジネスメソッドを宣言します。
コンクリート製品(コンクリート製品)の役割:コンクリート工場で製造されたコンクリート製品オブジェクトを定義し、抽象製品インターフェースで宣言されたビジネスメソッドを実装します。
抽象ファクトリパターンケース
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
//抽象苹果类
class AbstractApple
{
public:
virtual void showName() = 0;
};
//抽象香蕉
class AbstractBanana
{
public:
virtual void showName() = 0;
};
//抽象鸭梨
class AbstractPear
{
public:
virtual void showName() = 0;
};
//中国苹果
class ChineseApple : public AbstractApple
{
public:
virtual void showName()
{
cout << "中国苹果" << endl;
}
};
//美国苹果
class AmericanApple : public AbstractApple
{
public:
virtual void showName()
{
cout << "美国苹果" << endl;
}
};
//日本苹果
class JapaneseApple : public AbstractApple
{
public:
virtual void showName()
{
cout << "日本苹果" << endl;
}
};
//中国香蕉
class ChineseBanana : public AbstractBanana
{
public:
virtual void showName()
{
cout << "中国香蕉" << endl;
}
};
//美国香蕉
class AmericanBanana : public AbstractBanana
{
public:
virtual void showName()
{
cout << "美国香蕉" << endl;
}
};
//日本香蕉
class JapaneseBanana : public AbstractBanana
{
public:
virtual void showName()
{
cout << "日本香蕉" << endl;
}
};
//中国鸭梨
class ChinesePear : public AbstractPear
{
public:
virtual void showName() {
cout << "中国鸭梨" << endl;
}
};
//美国鸭梨
class AmericanPear : public AbstractPear
{
public:
virtual void showName()
{
cout << "美国鸭梨" << endl;
}
};
//日本鸭梨
class JapanesePear : public AbstractPear
{
public:
virtual void showName()
{
cout << "日本鸭梨" << endl;
}
};
//抽象工厂
class AbstractFactory
{
public:
virtual AbstractApple* CreateApple() = 0;
virtual AbstractBanana* CreateBanana() = 0;
virtual AbstractPear* CreatePear() = 0;
};
//中国工厂
class ChineseFactory : public AbstractFactory
{
public:
virtual AbstractApple* CreateApple()
{
return new ChineseApple;
}
virtual AbstractBanana* CreateBanana()
{
return new ChineseBanana;
}
virtual AbstractPear* CreatePear()
{
return new ChinesePear;
}
};
//美国工厂
class AmericanFactory : public AbstractFactory
{
public:
virtual AbstractApple* CreateApple()
{
return new AmericanApple;
}
virtual AbstractBanana* CreateBanana()
{
return new AmericanBanana;
}
virtual AbstractPear* CreatePear()
{
return new AmericanPear;
}
};
//美国工厂
class JapaneseFactory : public AbstractFactory
{
public:
virtual AbstractApple* CreateApple()
{
return new JapaneseApple;
}
virtual AbstractBanana* CreateBanana()
{
return new JapaneseBanana;
}
virtual AbstractPear* CreatePear()
{
return new JapanesePear;
}
};
void test01()
{
AbstractFactory* factory = NULL;
AbstractApple* apple = NULL;
AbstractBanana* banana = NULL;
AbstractPear* pear = NULL;
factory = new ChineseFactory; //创建中国工厂
apple = factory->CreateApple();
banana = factory->CreateBanana();
pear = factory->CreatePear();
apple->showName();
banana->showName();
pear->showName();
delete pear;
delete banana;
delete apple;
delete factory;
factory = new AmericanFactory; //创建美国工厂
apple = factory->CreateApple();
banana = factory->CreateBanana();
pear = factory->CreatePear();
apple->showName();
banana->showName();
pear->showName();
delete pear;
delete banana;
delete apple;
delete factory;
factory = new JapaneseFactory; //创建日本工厂
apple = factory->CreateApple();
banana = factory->CreateBanana();
pear = factory->CreatePear();
apple->showName();
banana->showName();
pear->showName();
delete pear;
delete banana;
delete apple;
delete factory;
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}
抽象ファクトリパターンの長所と短所
利点:
(1)ファクトリメソッドパターンの利点があります
(2)製品ファミリ内の複数のオブジェクトが連携して動作するように設計されている場合、クライアントは常に同じ製品ファミリ内のオブジェクトのみを使用できます。
(3)既存のシステムを変更せずに、「開閉原理」に準拠した新しい製品ファミリを追加すると非常に便利です。
短所:
新しい製品レベルの構造を追加するのは面倒で、元のシステムに大幅な変更が必要であり、抽象レイヤーコードを変更する必要さえあります。これは明らかに大きな不便をもたらし、「オープンアンドクローズの原則」に違反します。
該当シーン
(1)システムには複数の製品ファミリがあります。また、毎回1つの製品ファミリのみが使用されます。ユーザーは、構成ファイルやその他の方法で製品ファミリを動的に変更でき、新しい製品ファミリを簡単に追加することもできます。
(2)製品グレードの構造は安定しています。設計が完了した後、新しい製品レベルの構造がシステムに追加されたり、既存の製品レベルの構造が削除されたりすることはありません。