シンプルなファクトリパターン
作成モデルは、オブジェクトを作成するプロセスに焦点を当てており、ソフトウェア開発で広く使用されています。作成モードでは、オブジェクトの作成と使用を分離する方法を説明します。これにより、ユーザーはオブジェクトを使用する過程でオブジェクト作成の詳細を気にする必要がなくなり、システムの結合度が低下し、システムを簡単に変更できるようになります。展開します。
シンプルファクトリパターンは、最もシンプルなデザインパターンの1つですが、頻繁に適用され、残りの作成パターンの基礎にもなるため、最初にシンプルファクトリパターンを学習する必要があります。
単純なファクトリモデルの基本的な実現プロセス
上記の例から、単純なファクトリの実装プロセスを簡単に要約できます。
- いくつかのパブリックメソッドの実装を含む抽象的な製品クラスを設計します。
- バスケットボール、サッカー、バレーボールなどの抽象的な製品カテゴリから特定の製品カテゴリをいくつか導き出し、特定の製品カテゴリを特定の製品生産関連コードを実現します。
- ファクトリクラスを設計します。ファクトリクラスは、さまざまな製品を生成するためのファクトリメソッドを提供します。このメソッドは、入力パラメータ(製品名)に従ってさまざまな特定の製品クラスオブジェクトを作成します。
- 顧客は、ファクトリクラスのファクトリメソッドを呼び出し、特定の製品パラメータを渡すだけで、特定の製品オブジェクトを取得できます。
上図のように、お客様はご自身のニーズを工場に提示し、工場はお客様のニーズに応じて対応する製品を製造します。お客様は製品の具体的な製造工程を理解する必要はありません。
上記のように、単純なファクトリパターンの実装プロセスは簡単に導き出すことができます。
- いくつかのパブリックメソッドの実装を含む抽象的な製品クラスを設計します。
- バスケットボール、サッカー、バレーボールなどの抽象的な製品カテゴリから特定の製品カテゴリをいくつか導き出し、特定の製品カテゴリを特定の製品生産関連コードを実現します。
- ファクトリクラスを設計します。ファクトリクラスは、さまざまな製品を生成するためのファクトリメソッドを提供します。このメソッドは、入力パラメータ(製品名)に従ってさまざまな特定の製品クラスオブジェクトを作成します。
- 顧客は、ファクトリクラスのファクトリメソッドを呼び出し、特定の製品パラメータを渡すだけで、特定の製品オブジェクトを取得できます。
単純なファクトリパターンの定義と例からわかるように、単純なファクトリパターンにはおおよそ3つの役割があります。
- 工場:顧客から提供された特定の製品カテゴリのパラメータに基づいて、特定の製品インスタンスを作成します。
- Abstract Product(AbstractProduct):製品を作成するためのパブリックメソッドを含む、特定の製品クラスの基本クラス。
- 具体的な製品(ConcreteProduct):特定の製品の特定の実装方法を含む、抽象製品の派生クラスであり、単純なファクトリパターンの目標です。
単純なファクトリパターンのUMLクラス図は次のとおりです。
上記の前の例:
simplefactory.h
#include <iostream>
#include <string.h>
using namespace std;
//抽象产品类AbstractProduct
class AbstractSportProduct
{
public:
AbstractSportProduct()
{
}
//抽象方法:
void printName(){
};
void play(){
};
};
//具体产品类Basketball
class Basketball : public AbstractSportProduct
{
public:
Basketball()
{
printName();
play();
}
//具体实现方法
void printName()
{
cout << "Get Basketball\n";
}
void play()
{
cout << "Play Basketball\n";
}
};
//具体产品类Football
class Football : public AbstractSportProduct
{
public:
Football()
{
printName();
play();
}
//具体实现方法
void printName()
{
cout << "Get Football\n";
}
void play()
{
cout << "Play Football\n";
}
};
//具体产品类Volleyball
class Volleyball : public AbstractSportProduct
{
public:
Volleyball()
{
printName();
play();
}
//具体实现方法
void printName()
{
cout << "Get Volleyball\n";
}
void play()
{
cout << "Play Volleyball\n";
}
};
class Factory
{
public:
AbstractSportProduct *getSportProduct(string productName)
{
AbstractSportProduct *pro = NULL;
if (productName == "Basketball")
{
pro = new Basketball();
}
else if (productName == "Football")
{
pro = new Football();
}
else if (productName == "Volleyball")
{
pro = new Volleyball();
}
return pro;
}
};
simplefactory.cc
#include <iostream>
#include "simplefactory.h"
using namespace std;
int main()
{
cout << "简单工厂模式\n";
//定义工厂类对象
Factory *fac = new Factory();
AbstractSportProduct *product = NULL;
product = fac->getSportProduct("Basketball");
if (product)
{
delete product;
}
product = fac->getSportProduct("Football");
if (product)
{
delete product;
}
product = fac->getSportProduct("Volleyball");
if (product)
{
delete product;
}
delete fac;
return 0;
}
コンパイル後、出力を実行します。
简单工厂模式
Get Basketball
Play Basketball
Get Football
Play Football
Get Volleyball
Play Volleyball
単純なファクトリパターンの概要
単純なファクトリモデルの利点は次のとおりです。
- ファクトリクラスは、特定の製品を作成するためのメソッドを提供し、特定の判断ロジックを含むため、顧客は製品作成プロセスに参加する必要がありません。
- お客様は、対応する製品のパラメータを知っているだけで済みます。パラメータは、数字、文字、文字列など、一般的にシンプルで覚えやすいものです。
もちろん、単純なファクトリモデルには明らかな欠点があります。ある日、ジャングルが野球をしたいと仮定すると、通常は非常に単純に感じ、抽象製品クラスから野球クラスを派生させ、ファクトリクラスのgetSportProductメソッドに「productName == "Baseball」の条件分岐を追加します。これは
true 。、しかし、これは明らかに開閉の原則(拡張のために開く、変更のために閉じる)に違反します。つまり、関数が拡張されると、既存のコードが変更されます。一方、単純なのすべての判断ロジックはファクトリモデルはファクトリクラスに実装されます。ファクトリ設計が失敗すると、システム全体が影響を受けます。