- インターフェイスを介してオブジェクトの生成を行うことで、オブジェクト間の結合度を弱める。
- クラスの切り替えや新規クラスの追加を柔軟に行えるようにする。
- Product の種類を増やす場合、新しいクラスを定義すれば良い。既存のファクトリメソッドを修正する必要はない。
- Product 毎にファクトリクラスを用意する必要がある。
#include <iostream>
using namespace std;
// "Product" abstract class
class Product {
public:
virtual ~Product() {
cout << "Product Destructor" << endl;
}
virtual void Operation() = 0;
virtual void Destroy() = 0;
};
// "ConcreteProduct" class
class ProductA : public Product {
public:
virtual ~ProductA() {
cout << "ProductA Destructor" << endl;
}
virtual void Operation() {
cout << "ProductA Operation" << endl;
}
virtual void Destroy() {
delete this;
}
};
// "ConcreteProduct" class
class ProductB : public Product {
public:
virtual ~ProductB() {
cout << "ProductB Destructor" << endl;
}
virtual void Operation() {
cout << "ProductB Operation" << endl;
}
virtual void Destroy() {
delete this;
}
};
// "Factory" abstract class
class Factory {
public:
virtual Product* CreateProduct() = 0;
};
// "ConcreteFactory" class
class FactoryA : public Factory {
public:
Product* CreateProduct() {
return new ProductA;
}
};
// "ConcreteFactory" class
class FactoryB : public Factory {
public:
Product* CreateProduct() {
return new ProductB;
}
};
// "client"
int main(int argc, char **argv) {
Product *product;
Factory *factory;
for (int i=0; i<2; ++i) {
if (i == 0) {
factory = new FactoryA();
} else {
factory = new FactoryB();
}
product = factory->CreateProduct();
product->Operation();
product->Destroy();
delete factory;
}
return 0;
}
出力
ProductA Operation
ProductA Destructor
Product Destructor
ProductB Operation
ProductB Destructor
Product Destructor
Product の delete を、Factory のデストラクタで行う
(複数 Product を生成した場合も、全部破棄する)
#include <iostream>
#include <vector>
using namespace std;
// "Product" abstract class
class Product {
public:
virtual ~Product() {
cout << "Product Destructor" << endl;
}
virtual void Operation() = 0;
};
// "ConcreteProduct" class
class ProductA : public Product {
public:
virtual ~ProductA() {
cout << "ProductA Destructor" << endl;
}
virtual void Operation() {
cout << "ProductA Operation" << endl;
}
};
// "ConcreteProduct" class
class ProductB : public Product {
public:
virtual ~ProductB() {
cout << "ProductB Destructor" << endl;
}
virtual void Operation() {
cout << "ProductB Operation" << endl;
}
};
// "Factory" abstract class
class Factory {
public:
virtual ~Factory() {
vector<Product*>::iterator it = m_prods.begin();
while (it != m_prods.end()) {
delete *it;
++it;
}
};
virtual Product* CreateProduct() = 0;
protected:
vector<Product*> m_prods;
};
// "ConcreteFactory" class
class FactoryA : public Factory {
public:
Product* CreateProduct() {
Product* prod = new ProductA;
m_prods.push_back(prod);
return prod;
}
};
// "ConcreteFactory" class
class FactoryB : public Factory {
public:
Product* CreateProduct() {
Product *prod = new ProductB;
m_prods.push_back(prod);
return prod;
}
};
// "client"
int main(int argc, char **argv) {
Product *product;
Factory *factory;
for (int i=0; i<2; ++i) {
if (i == 0) {
factory = new FactoryA();
} else {
factory = new FactoryB();
}
product = factory->CreateProduct();
product->Operation();
delete factory;
}
return 0;
}
参考サイト
最終更新:2012年01月29日 17:19