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 }
運行結果