// 所有原创文章转载请注明作者及链接// blackboycpp(AT)gmail.com// QQ群: 135202158 类图: 实现代码: /******************************************************************** File: abstract_factory.h Author: blackboy blackboycpp@gmail.com Purpose: 抽象工厂模式 Created: 2011-03-15 Modified: 2011-03-15 09:21 *********************************************************************/ #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 #include <iostream> #include "abstract_factory.h" 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"; } } //#include <iostream> #include <cstdlib> #include "abstract_factory.h" using namespace blackboycpp; 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; }