abstract factory pattern,抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
Abstract Factory模式存在的意义就是为了创建各系列的对象而存在的。相对Factory Method模式的解决“单个对象”的需求变化,Abstract Factory模式解决“系列相关对象”的需求变化。明确的理解就是抽象工厂模式提供多个产品的构建。

抽象工厂(Abstract Factory):它与应用系统商业逻辑无关。
具体工厂(Concrete Factory):这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
抽象产品(Abstract Product):担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product):抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
实质:其实就是在工厂方法模式中,让工厂实现多个产品的生产,即创建多个不同的类。
举例:
由于市场份额达到一定程度,为了增长销售业绩,公司决定生产手机扩展新的业务,所以目前工厂不仅要生产汽车还要生产手机,开始做手机了。旗下有一个生产车间又生产奥迪汽车,还生产诺基亚手机,另外一个车间不仅生产奔驰汽车还生产苹果手机。
1 #include <iostream> 2class Car 3{ 4public: 5virtualvoid run( )=0; 6}; 7 8class Phone 9{ 10public: 11virtualvoid call( )=0; 12}; 13 14class BenzCar:public Car 15{ 16public: 17void run( ); 18}; 19void BenzCar::run( ) 20{ 21 std::cout<<"BenzCar is running"<<std::endl; 22} 23 24class AudiCar:public Car 25{ 26public: 27void run( ); 28}; 29void AudiCar::run( ) 30{ 31 std::cout<<"AudiCar is running"<<std::endl; 32} 33 34class NokiaPhone:public Phone 35{ 36public: 37void call( ); 38}; 39void NokiaPhone::call( ) 40{ 41 std::cout<<"NokiaPhone is calling"<<std::endl; 42} 43 44class iPhone:public Phone 45{ 46public: 47void call( ); 48}; 49void iPhone::call( ) 50{ 51 std::cout<<"iPhone is running"<<std::endl; 52} 53 54class abstractFactory 55{ 56public: 57virtual Car* createCar( )=0; 58virtual Phone* createPhone( )=0; 59}; 60 61class AudiNokiaFactory:public abstractFactory 62{ 63public: 64 Car* createCar( ); 65 Phone* createPhone( ); 66}; 67 Car * AudiNokiaFactory::createCar( ) 68{ 69returnnew AudiCar( ); 70} 71 Phone * AudiNokiaFactory::createPhone( ) 72{ 73 retrun new NokiaPhone( ); 74} 75 76class BenzIphoneFactory:public abstractFactory 77{ 78public: 79 Car* createCar( ); 80 Phone* createPhone( ); 81}; 82 Car * BenzIphoneFactory::createCar( ) 83{ 84returnnew createCar( ); 85} 86 Phone * BenzIphoneFactory::createPhone( ) 87{ 88returnnew createPhone( ); 89} 90 91void createAndTest(abstractFactory *p) 92{ 93 car* c=p->createCar( ); 94 c->run( ); 95 delete c; 96 phone *ph=p->createPhone( ); 97 ph->call( ); 98 delete c; 99}100101int main(int argc,char ** argv )102{103 abstractFactory * p1=new AudiNokiaFactory( );104 abstractFactory * p2=new BenzIphoneFactory( );105 createAndTest(p1);106 createAndTest(p2);107 delete p2;108 delete p1;109 }运行结果
