抽象工廠模式(Abstract Factory):提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
抽象工廠模式最大的好處是便於交換產品系列,由於具體工廠類只在初始化的時候出現一次,這就使得改變一個應用的具體工廠變得非常容易,它只需改變具體的工廠即可使用不同的產品配置。同時,它讓具體的創建實例的過程與客戶端分離,客戶端是通過它們的抽象接口操作實例,產品的具體類名也被具體工廠的實現分離,不會出現在客戶代碼中,從而完全遵循了開發--封閉原則和依賴倒裝原則。
UML類圖:
抽象工廠模式基本代碼如下:
/********************************************************************
filename: AbstractFactory.h
created: 2012-09-24
author: firehood
purpose: firehood 學設計模式之---抽象工廠模式
*********************************************************************/
#pragma once
#include <iostream>
using namespace std;
// 抽象產品A
class AbstractProductA
{
public:
AbstractProductA(void){}
virtual ~AbstractProductA(void){}
};
// 具體產品A1,抽象產品A的第一種實現
class ConcreteProductA1:public AbstractProductA
{
public:
ConcreteProductA1(void)
{
cout<<"生產產品A1"<<endl;
}
virtual ~ConcreteProductA1(void)
{
cout<<"銷燬產品A1"<<endl;
}
};
// 具體產品A2,抽象產品A的第二種實現
class ConcreteProductA2:public AbstractProductA
{
public:
ConcreteProductA2(void)
{
cout<<"生產產品A2"<<endl;
}
virtual ~ConcreteProductA2(void)
{
cout<<"銷燬產品A2"<<endl;
}
};
// 抽象產品B
class AbstractProductB
{
public:
AbstractProductB(void){}
virtual ~AbstractProductB(void){}
};
// 具體產品B1,抽象產品B的第一種實現
class ConcreteProductB1:public AbstractProductB
{
public:
ConcreteProductB1(void)
{
cout<<"生產產品B1"<<endl;
}
virtual ~ConcreteProductB1(void)
{
cout<<"銷燬產品B1"<<endl;
}
};
// 具體產品B2,抽象產品B的第二種實現
class ConcreteProductB2:public AbstractProductB
{
public:
ConcreteProductB2(void)
{
cout<<"生產產品B2"<<endl;
}
virtual ~ConcreteProductB2(void)
{
cout<<"銷燬產品B2"<<endl;
}
};
// 抽象工廠
class AbstractFactory
{
public:
AbstractFactory(void){}
virtual ~AbstractFactory(void){}
virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
};
// 具體工廠1
class ConcreteFactory1:public AbstractFactory
{
public:
ConcreteFactory1(void)
{
cout<<"創建工廠1"<<endl;
}
virtual ~ConcreteFactory1(void)
{
cout<<"銷燬工廠1"<<endl;
}
virtual AbstractProductA* CreateProductA()
{
// 創建產品A1
return new ConcreteProductA1();
}
virtual AbstractProductB* CreateProductB()
{
// 創建產品B1
return new ConcreteProductB1();
}
};
// 具體工廠2
class ConcreteFactory2:public AbstractFactory
{
public:
ConcreteFactory2(void)
{
cout<<"創建工廠2"<<endl;
}
virtual ~ConcreteFactory2(void)
{
cout<<"銷燬工廠2"<<endl;
}
virtual AbstractProductA* CreateProductA()
{
// 創建產品A2
return new ConcreteProductA2();
}
virtual AbstractProductB* CreateProductB()
{
// 創建產品B2
return new ConcreteProductB2();
}
};
客戶端調用代碼如下:
#include "AbstractFactory.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
cout<<"*************************************"<<endl;
cout<<"firehood 學設計模式之---抽象工廠模式"<<endl;
cout<<"*************************************"<<endl;
AbstractFactory *factory = new ConcreteFactory1();
//AbstractFactory *factory = new ConcreteFactory2();
AbstractProductA *productA = factory->CreateProductA();
AbstractProductB *productB = factory->CreateProductB();
delete productA;
delete productB;
delete factory;
system("pause");
return 0;
}
運行結果如下:
*************************************
firehood 學設計模式之---抽象工廠模式
*************************************
創建工廠1
生產產品A1
生產產品B1
銷燬產品A1
銷燬產品B1
銷燬工廠1
請按任意鍵繼續. . .