あなたのCreator
クラスは工場です。ProductFactory
例をより明確にするために、それを と呼びましょう。
(C++を使用していると仮定しています)
class Book : public Product
{
};
class Computer : public Product
{
};
class ProductFactory
{
public:
virtual Product* Make(int type)
{
switch (type)
{
case 0:
return new Book();
case 1:
return new Computer();
[...]
}
}
}
次のように呼び出します。
ProductFactory factory = ....;
Product* p1 = factory.Make(0); // p1 is a Book*
Product* p2 = factory.Make(1); // p2 is a Computer*
// remember to delete p1 and p2
だから、あなたの質問に答えるには:
サブクラスとの関係は?そして、サブクラスを何に使用することになっていますか?
ファクトリ パターンの定義が言っていることは、ファクトリは特定の型 (通常はインターフェイスまたは抽象クラス) のインスタンスを作成するための共通 API を定義するが、返される実装の実際の型 (したがってサブクラス参照) は、工場。この例では、ファクトリは有効なサブクラスでProduct
あるインスタンスを返します。Book
Computer
ファクトリ用の API を持つなど、ファクトリには他のイディオムがあり、ファクトリの具体的な実装は私の例では like を受け入れませんtype
が、次のように、返されるインスタンスのタイプと結合されます。
class ProductFactory
{
public:
virtual Product* Make() = 0;
}
class BookProductFactory : public ProductFactory
{
public:
virtual Product* Make()
{
return new Book();
}
}
このクラスでは、BookProductFactory
常にインスタンスが返さBook
れます。
ProductFactory* factory = new BookProductFactory();
Product* p1 = factory->Make(); // p1 is a Book
delete p1;
delete factory;
Abstract Factory
明確にするために、とデザイン パターンの間には少し混乱があるように思われるのでFactory method
、具体的な例を見てみましょう。
抽象ファクトリの使用
class ProductFactory {
protected:
virtual Product* MakeBook() = 0;
virtual Product* MakeComputer() = 0;
}
class Store {
public:
Gift* MakeGift(ProductFactory* factory) {
Product* p1 = factory->MakeBook();
Product* p2 = factory->MakeComputer();
return new Gift(p1, p2);
}
}
class StoreProductFactory : public ProductFactory {
protected:
virtual Product* MakeBook() { return new Book(); }
virtual Product* MakeComputer() { return new Computer(); }
}
class FreeBooksStoreProductFactory : public StoreProductFactory {
protected:
virtual Product* MakeBook() {
Book* b = new FreeBook(); // a FreeBook is a Book with price 0
return b;
}
}
これは次のように使用されます。
Store store;
ProductFactory* factory = new FreeBooksStoreProductFactory();
Gift* gift = factory->MakeGift(factory);
// gift has a FreeBook (Book with price 0) and a Computer
delete gift;
delete factory;
ファクトリ メソッドの使用
class Store {
public:
Gift* MakeGift() {
Product* p1 = MakeBook();
Product* p2 = MakeComputer();
return new Gift(p1, p2);
}
protected:
virtual Product* MakeBook() {
return new Book();
}
virtual Product* MakeComputer() {
return new Computer();
}
}
class FreeBooksStore : public Store {
protected:
virtual Product* MakeBook() {
Book* b = new FreeBook(); // a FreeBook is a Book with price 0
return b;
}
}
これは次のように使用されます。
Store* store = new FreeBooksStore();
Gift* gift = store->MakeGift();
// gift has a FreeBook (Book with price 0) and a Computer
delete gift;
delete store;
type
元の例で行ったようにディスクリミネーターを使用する場合は、parametized factory methods
さまざまな種類のオブジェクトを作成する方法を知っているメソッドを使用しています。Abstract Factory
しかし、それはまたはFactory Method
パターンのいずれかに現れる可能性があります。簡単なトリック: ファクトリ クラスを拡張する場合は、Abstract Factory を使用しています。作成メソッドでクラスを拡張する場合は、ファクトリ メソッドを使用しています。