抽象工廠(Abstract Factory)模式是爲了提供一系列相關或相互依賴對象的接口。對象建立型模式的一種。ui
咱們要生產兩個系列四種產品,分別是ConcreteProductA1/ConcreteProductA2/ConcreteProductB1/ConcreteProductB2。各個系列產品的啓動和退出方式相同,可是運行方式不一樣。這裏分別用一個具體工廠ConcreteFactory1和ConcreteFactory2的對象來生產多種產品。spa
一、AbstractFactory(聲明一個建立抽象產品對象的接口)code
class AbstractFactory{ public: AbstractFactory(){}; ~AbstractFactory(){}; virtual AbstractProductA* createProductA()=0; virtual AbstractProductB* createProductB()=0; };
二、ConcreteFactory(實現建立具體產品對象的操做)對象
/************************工廠1***************************/ class ConcreteFactory1:public AbstractFactory{ public: ConcreteFactory1(){}; ~ConcreteFactory1(){}; AbstractProductA* createProductA(); AbstractProductB* createProductB(); }; void ConcreteFactory1::createProductA(){ return new AbstractProductA(); } void ConcreteFactory1::vreateProdyctB(){ return new AbstractProductB(); } /************************工廠2***************************/ class ConcreteFactory2:public AbstractFactory{ public: ConcreteFactory2(){}; ~ConcreteFactory2(){}; AbstractProductA* createProductA(); AbstractProductB* createProductB(); }; void ConcreteFactory2::createProductA(){ return new AbstractProductA(); } void ConcreteFactory2::vreateProdyctB(){ return new AbstractProductB(); }
三、AbstractProduct(爲一類產品對象聲明一個接口)blog
/**************************抽象產品A*****************************/ class AbstractProductA{ public: AbstractProductA(){}; ~AbstractProductA(){}; void start(); virtual void execute()=0; void quit(); }; void AbstractProductA::start(){ cout<<"<---------------------A類產品是這樣啓動的----------------------->"<endl; } void AbstractProductA::quit(){ cout<<"<---------------------A類產品是這樣退出的----------------------->"<endl; } /**************************抽象產品B*****************************/ class AbstractProductB{ public: AbstractProductB(){}; ~AbstractProductB(){}; void start(); virtual void execute()=0; void quit(); }; void AbstractProductB::start(){ cout<<"<---------------------B類產品是這樣啓動的----------------------->"<endl; } void AbstractProductB::quit(){ cout<<"<---------------------B類產品是這樣退出的----------------------->"<endl; }
四、ConcreteProduct(定義一個將被相應的具體工廠建立的產品對象,實現AbstractProduct接口)接口
/**************************抽象產品A的具體產品A1*****************************/ class ConcreteProductA1:public AbstractProductA{ public: ConcreteProductA1(){}; ~ConcreteProductA1(){}; void execute(); }; void ConcreteProductA1::execute(){ cout<<"<---------------------產品1是這樣運行的----------------------->"<endl; } /**************************抽象產品A的具體產品A2*****************************/ class ConcreteProductA2:public AbstractProductA{ public: ConcreteProductA2(){}; ~ConcreteProductA2(){}; void execute(); }; void ConcreteProductA2::execute(){ cout<<"<---------------------產品2是這樣運行的----------------------->"<endl; } /**************************抽象產品B的具體產品B1*****************************/ class ConcreteProductB1:public AbstractProductB{ public: ConcreteProductB1(){}; ~ConcreteProductB1(){}; void execute(); }; void ConcreteProductB1::execute(){ cout<<"<---------------------產品1是這樣運行的----------------------->"<endl; } /**************************抽象產品B的具體產品B2*****************************/ class ConcreteProductB2:public AbstractProductB{ public: ConcreteProductB2(){}; ~ConcreteProductB2(){}; void execute(); }; void ConcreteProductB2::execute(){ cout<<"<---------------------產品2是這樣運行的----------------------->"<endl; }
五、客戶Client產品
int main(){ AbstractFactory *factory1 = new ConcreteFactory1(); /*********************生產產品A1****************************/ ConcreteProductA *pA1 = factory1.createProductA(); pA1->start(); //A是這麼啓動的 pA1->execute(); //A1是這樣運行的 pA1->quit(); //A是這樣退出的 /*********************生產產品B1****************************/ ConcreteProductB *pB1 = factory1.createProductB(); pB1->start(); //B是這麼啓動的 pB1->execute(); //B1是這樣運行的 pB1->quit(); //B是這樣退出的 AbstractFactory *factory2 = new ConcreteFactory2(); /*********************生產產品A2****************************/ ConcreteProductA *pA2 = factory2.createProductA(); pA2->start(); //A是這麼啓動的 pA2->execute(); //A2是這樣運行的 pA2->quit(); //A是這樣退出的 /*********************生產產品B2****************************/ ConcreteProductB *pB2 = factory2.createProductB(); pB2->start(); //B是這麼啓動的 pB2->execute(); //B2是這樣運行的 pB2->quit(); //B是這樣退出的 return 0; }
抽象工廠跟工廠方法模式可能區分有點模糊:工廠方法模式針對的是一個產品等級結構;而抽象工廠模式針對的是多個產品等級結構。抽象工廠模式主要用來實現生產一系列的產品。it
版權全部,歡迎轉載,轉載請註明出處。class