まず、抽象ファクトリパターンを使用するために必要な基本要素を確認しましょう。抽象ファクトリパターンでは、以下の要素が関与します:
-
AbstractFactory(抽象ファクトリ): 抽象ファクトリは、関連するオブジェクトを生成するためのインターフェースを定義します。このインターフェースは、具体的なファクトリクラスで実装されます。
-
ConcreteFactory(具体ファクトリ): 具体ファクトリは、抽象ファクトリのインターフェースを実装し、関連するオブジェクトを生成します。具体ファクトリは、異なる種類のオブジェクトを生成するためにサブクラス化されることがあります。
-
AbstractProduct(抽象製品): 抽象製品は、生成されるオブジェクトの共通インターフェースを定義します。具体的な製品クラスは、この抽象クラスを継承します。
-
ConcreteProduct(具体製品): 具体製品は、抽象製品のインターフェースを実装し、具体的なオブジェクトを表します。
以下に、抽象ファクトリを使用して異なる種類のオブジェクトを生成する簡単な例を示します。
// AbstractProduct
class AbstractProduct {
public:
virtual void performAction() = 0;
};
// ConcreteProductA
class ConcreteProductA : public AbstractProduct {
public:
void performAction() override {
// 具体的なアクションを実行するコード
}
};
// ConcreteProductB
class ConcreteProductB : public AbstractProduct {
public:
void performAction() override {
// 具体的なアクションを実行するコード
}
};
// AbstractFactory
class AbstractFactory {
public:
virtual AbstractProduct* createProduct() = 0;
};
// ConcreteFactoryA
class ConcreteFactoryA : public AbstractFactory {
public:
AbstractProduct* createProduct() override {
return new ConcreteProductA();
}
};
// ConcreteFactoryB
class ConcreteFactoryB : public AbstractFactory {
public:
AbstractProduct* createProduct() override {
return new ConcreteProductB();
}
};
// クライアントコード
int main() {
AbstractFactory* factory = new ConcreteFactoryA();
AbstractProduct* product = factory->createProduct();
product->performAction();
delete product;
delete factory;
return 0;
}
このコード例では、抽象ファクトリパターンを使用して、AbstractProduct
を継承したConcreteProductA
とConcreteProductB
のインスタンスを生成します。AbstractFactory
を継承したConcreteFactoryA
とConcreteFactoryB
は、それぞれConcreteProductA
とConcreteProductB
のインスタンスを生成する責任を持ちます。
クライアントコードでは、ConcreteFactoryA
を使用してAbstractProduct
のインスタンスを生成し、その後performAction()
メソッドを呼び出しています。必要に応じて、ConcreteFactoryB
を使用することで異なる種類のオブジェクトを生成することもできます。
このように、抽象ファクトリパターンを使用すると、異なる種類のオブジェクトを作成するための一貫した方法を提供することができます。これにより、コードの柔軟性と拡張性が向上し、関連するオブジェクトの組み合わせを簡単に変更できるようになります。
以上が、C++で抽象ファクトリパターンを実装するための基本的なコーディング例です。このパターンを使用することで、異なる種類のオブジェクトを生成するための一貫した方法を提供し、コードの保守性と再利用性を高めることができます。