Also called a kit.
A client uses a collection of related products or components, but can't anticipate how the products will be implemented.
Assume abstract base classes are introduced for a family of related components/products:
class ComponentA {...};
class ComponentB {...};
An abstract factory/kit provides abstract factory methods for each of these components:
class Factory
{
public:
virtual ComponentA* makeComponentA() =
0;
virtual ComponentB* makeComponentB() =
0;
// etc.
};
An assembly constructor can now be parameterized by a factory that makes the necessary components:
class Assembly
{
private:
ComponentA* a;
ComponentB* b;
// etc.
public:
Assembly(Factory* f)
{
a = f->makeComponentA();
b = f->makeComponentB();
// etc.
}
};