// 所有原创文章转载请注明作者及链接
// blackboycpp(AT)gmail.com
// QQ群: 135202158
类图:
实现代码:
#ifndef __ABSTRACTORY_FACTORY_H__
#define __ABSTRACTORY_FACTORY_H__
namespace blackboycpp
{
class AbstractProductA;
class AbstractProductB;
//////////////////////////////////////////////////////////////////////////
// Factories
class AbstractFactory
{
public:
virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
};
class ConcreteFactory1 : public AbstractFactory
{
public:
virtual AbstractProductA* CreateProductA();
virtual AbstractProductB* CreateProductB();
};
class ConcreteFactory2 : public AbstractFactory
{
public:
virtual AbstractProductA* CreateProductA();
virtual AbstractProductB* CreateProductB();
};
//////////////////////////////////////////////////////////////////////////
// Products
class AbstractProductA
{
public:
virtual void Foo() = 0;
};
class AbstractProductB
{
public:
virtual void Bar() = 0;
};
class ProductA1 : public AbstractProductA
{
public:
virtual void Foo();
};
class ProductA2 : public AbstractProductA
{
public:
virtual void Foo();
};
class ProductB1 : public AbstractProductB
{
public:
virtual void Bar();
};
class ProductB2 : public AbstractProductB
{
public:
virtual void Bar();
};
}
#endif
namespace blackboycpp
{
//////////////////////////////////////////////////////////////////////////
// Factories
AbstractProductA* ConcreteFactory1::CreateProductA()
{
std::cout << "ConcreteFactory1::CreateProductA()/n";
return new ProductA1;
}
AbstractProductB* ConcreteFactory1::CreateProductB()
{
std::cout << "ConcreteFactory1::CreateProductB()/n";
return new ProductB1;
}
AbstractProductA* ConcreteFactory2::CreateProductA()
{
std::cout << "ConcreteFactory2::CreateProductA()/n";
return new ProductA2;
}
AbstractProductB* ConcreteFactory2::CreateProductB()
{
std::cout << "ConcreteFactory2::CreateProductB()/n";
return new ProductB2;
}
//////////////////////////////////////////////////////////////////////////
// Products
void ProductA1::Foo()
{
std::cout << "ProductA1::Foo()/n";
}
void ProductB1::Bar()
{
std::cout << "ProductB1::Bar()/n";
}
void ProductA2::Foo()
{
std::cout << "ProductA2::Foo()/n";
}
void ProductB2::Bar()
{
std::cout << "ProductB2::Bar()/n";
}
}
void Client(AbstractFactory* factory)
{
AbstractProductA* pa = factory->CreateProductA();
AbstractProductB* pb = factory->CreateProductB();
pa->Foo();
pb->Bar();
delete pa;
delete pb;
}
int main(int argc, char** argv)
{
ConcreteFactory1* factory1 = new ConcreteFactory1;
Client(factory1);
delete factory1;
system("pause");
return 0;
}