淺談C++設計模式之抽象工廠(Abstract Factory)

  抽象工廠(Abstract Factory)模式是爲了提供一系列相關或相互依賴對象的接口。對象建立型模式的一種。ui

  • 客戶Client
  • 抽象工廠接口AbstractFactory
  • 抽象工廠的實現類ConcreteFactory
  • 抽象產品接口AbstractProduct
  • 產品實現類ConcreteProduct

  咱們要生產兩個系列四種產品,分別是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

相關文章
相關標籤/搜索