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