オブジェクトを使用する場合は、クラスを介してオブジェクトをインスタンス化する必要があります。つまり、新しいオブジェクトが必要です。new のプロセスは非常に複雑で、ファイルの読み取り -> テキストの解析 -> オブジェクトの作成 -> 属性の値の設定 のプロセスを経る必要があります。ファクトリ モードの導入は、クラスを作成するステップがファクトリによって完了されることを意味し、ファクトリで作成されたクラスのみを使用する必要があります。ファクトリを使用する場合、必要なオブジェクトをファクトリに知らせる必要があるため、パラメータを渡すことでファクトリにニーズを伝えることができます
定義のアイデア: 単純なファクトリ パターンでは、さまざまなパラメーターに従ってさまざまなクラスのインスタンスを返すことができます。単純なファクトリ パターンは、他のクラスのインスタンスの作成を担当するクラスを明確に定義し、作成されたインスタンスには通常、共通の親クラスがあります。
利点:
- クライアントと具体的な実装クラスの分離を実現
- クライアントは、製品オブジェクトを直接作成する責任から解放され、代わりに単に製品製品を「消費」します。
- クライアントは、作成された特定の製品カテゴリのクラス名を知る必要はありませんが、特定の製品カテゴリに対応するパラメータを知る必要があるだけです。
短所:
- 新しい製品カテゴリを追加する場合、オープンとクローズの原則に準拠していないソース コードを変更する必要があります。
- このクラスに問題がある場合、すべての製品クラスの作成ロジックはファクトリ クラスに集中します。システム全体が影響を受ける
該当するシナリオ:
- ファクトリ クラスは、より少ないオブジェクトを作成する責任があります。
- クライアントはファクトリ クラスに渡されたパラメータのみを認識し、オブジェクトの作成方法は気にしません。
単純な工場パターンは開閉の原則に適合しないため、上司はこのパターンを 24 の設計パターンから削除しました。
コードの実装(携帯電話製品)
最初に携帯電話の抽象クラスを作成し、特定の製品の携帯電話に指定された機能が必要であることを指定します。つまり、製品クラスがこのクラスのメソッドをオーバーライドする必要があります。
//抽象手机
class AbstractPhone
{
public:
virtual void ShowName() = 0;
};
特定の製品の携帯電話は、抽象携帯電話クラスを継承し、そのメソッドを書き換えます
//华为
class Huawei : public AbstractPhone
{
public:
virtual void ShowName()
{
cout << "Huawe Phone" << endl;
}
};
//小米
class Xiaomi : public AbstractPhone
{
public:
virtual void ShowName()
{
cout << "Xiaomi Phone" << endl;
}
};
//苹果
class Apple : public AbstractPhone
{
public:
virtual void ShowName()
{
cout << "Apple Phone" << endl;
}
};
パラメータを渡して、生成する必要がある電話を決定します
//手机工厂
class PhoneFactory
{
public:
static AbstractPhone* CreatePhone(string name)
{
if (name == "huawei")
//...生产细节
return new Huawei;
else if (name == "xiaomi")
//...生产细节
return new Xiaomi;
else if (name == "apple")
//...生产细节
return new Apple;
else
return nullptr;
}
};
テスト:
void test()
{
//创建工厂
PhoneFactory* factor = new PhoneFactory;
//创建手机
AbstractPhone* phone;
//指定工厂需要创建的手机
phone = factor->CreatePhone("huawei");
phone->ShowName();
delete phone;
phone = factor->CreatePhone("xiaomi");
phone->ShowName();
delete phone;
phone = factor->CreatePhone("apple");
phone->ShowName();
delete phone;
delete factor;
}
実行中のスクリーンショット:
推奨される読み取り設計パターン C++ ファクトリ メソッド パターン