使用模板元編程自動生成抽象工廠接口及其具體實現,支持:
單個產品的抽象創建接口,使用 `Type2Type
template
class AbstractFactoryUnit {
public:
virtual T* DoCreate(Type2Type) = 0;
virtual ~AbstractFactoryUnit() {}
};
繼承 `GenScatterHierarchy
template class Unit = AbstractFactoryUnit>
class AbstractFactory : public GenScatterHierarchy {
public:
typedef TList ProductList;
template
T* Create() {
Unit& unit = *this;
return unit.DoCreate(Type2Type());
}
};
使用 `new` 創建對象,繼承鏈中自動獲取抽象產品類型:
template
class OpNewFactoryUnit : public Base {
typedef typename Base::ProductList BaseProductList;
protected:
typedef typename BaseProductList::Tail ProductList;
public:
typedef typename BaseProductList::Head AbstractProduct;
// ConcreteProduct 由具體工廠指定
ConcreteProduct* DoCreate(Type2Type) {
return new ConcreteProduct();
}
};
將抽象產品列表映射到具體產品列表,線性繼承鏈自動實現所有 `DoCreate`:
template <
class AbstractFact,
template class Creator = OpNewFactoryUnit,
class TList = typename AbstractFact::ProductList
>
class ConcreteFactory
: public GenLinearHierarchy<
typename Reverse::Result, // 反轉順序匹配線性繼承
Creator,
AbstractFact
> {
public:
typedef typename AbstractFact::ProductList ProductList;
typedef TList ConcreteProductList;
};
// 產品層次
class Soldier { virtual ~Soldier() {} };
class Monster { virtual ~Monster() {} };
class SuperMonster { virtual ~SuperMonster() {} };
class SillySoldier : public Soldier {};
class SillyMonster : public Monster {};
class SillySuperMonster : public SuperMonster {};
// 定義工廠
typedef AbstractFactory AbstractEnemyFactory;
typedef ConcreteFactory EasyFactory;
// 使用
std::auto_ptr factory(new EasyFactory);
Monster* m = factory->Create(); // 返回 SillyMonster*
delete m;

此模式展示了 C++ 模板元編程「類型列表驅動類生成」的強大能力,將設計模式 (抽象工廠) 固化為可復用的庫組件,實現「零樣板代碼」的類型安全工廠創建。