提供一個創建一系列相關或相互依賴物件的介面,而無需指定它們具體的類別。

CreateProductA(), CreateProductB()。#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H
class AbstractProductA {
public:
AbstractProductA() {}
virtual ~AbstractProductA() {}
};
class ConcreteProductA1 : public AbstractProductA {
public:
ConcreteProductA1(); virtual ~ConcreteProductA1();
};
class ConcreteProductA2 : public AbstractProductA {
public:
ConcreteProductA2(); virtual ~ConcreteProductA2();
};
class AbstractProductB {
public:
AbstractProductB() {}
virtual ~AbstractProductB() {}
};
class ConcreteProductB1 : public AbstractProductB {
public:
ConcreteProductB1(); virtual ~ConcreteProductB1();
};
class ConcreteProductB2 : public AbstractProductB {
public:
ConcreteProductB2(); virtual ~ConcreteProductB2();
};
class AbstractFactory {
public:
AbstractFactory() {}
virtual ~AbstractFactory() {}
virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
};
class ConcreteFactory1 : public AbstractFactory {
public:
ConcreteFactory1(); virtual ~ConcreteFactory1();
virtual AbstractProductA* CreateProductA();
virtual AbstractProductB* CreateProductB();
};
class ConcreteFactory2 : public AbstractFactory {
public:
ConcreteFactory2(); virtual ~ConcreteFactory2();
virtual AbstractProductA* CreateProductA();
virtual AbstractProductB* CreateProductB();
};
#endif
#include <iostream>
#include "AbstractFactory.h"
ConcreteProductA1::ConcreteProductA1() { std::cout << "construction of ConcreteProductA1\n"; }
ConcreteProductA1::~ConcreteProductA1() { std::cout << "destruction of ConcreteProductA1\n"; }
ConcreteProductA2::ConcreteProductA2() { std::cout << "construction of ConcreteProductA2\n"; }
ConcreteProductA2::~ConcreteProductA2() { std::cout << "destruction of ConcreteProductA2\n"; }
ConcreteProductB1::ConcreteProductB1() { std::cout << "construction of ConcreteProductB1\n"; }
ConcreteProductB1::~ConcreteProductB1() { std::cout << "destruction of ConcreteProductB1\n"; }
ConcreteProductB2::ConcreteProductB2() { std::cout << "construction of ConcreteProductB2\n"; }
ConcreteProductB2::~ConcreteProductB2() { std::cout << "destruction of ConcreteProductB2\n"; }
ConcreteFactory1::ConcreteFactory1() { std::cout << "construction of ConcreteFactory1\n"; }
ConcreteFactory1::~ConcreteFactory1() { std::cout << "destruction of ConcreteFactory1\n"; }
AbstractProductA* ConcreteFactory1::CreateProductA() { return new ConcreteProductA1(); }
AbstractProductB* ConcreteFactory1::CreateProductB() { return new ConcreteProductB1(); }
ConcreteFactory2::ConcreteFactory2() { std::cout << "construction of ConcreteFactory2\n"; }
ConcreteFactory2::~ConcreteFactory2() { std::cout << "destruction of ConcreteFactory2\n"; }
AbstractProductA* ConcreteFactory2::CreateProductA() { return new ConcreteProductA2(); }
AbstractProductB* ConcreteFactory2::CreateProductB() { return new ConcreteProductB2(); }
#include "AbstractFactory.h"
#include <cstdlib>
int main() {
ConcreteFactory1* pFactory1 = new ConcreteFactory1();
AbstractProductA* pProductA = pFactory1->CreateProductA();
ConcreteFactory2* pFactory2 = new ConcreteFactory2();
AbstractProductB* pProductB = pFactory2->CreateProductB();
delete pFactory1; delete pProductA;
delete pFactory2; delete pProductB;
return 0;
}