抽象工廠模式
抽象工廠模式的概念
抽象工廠模式是所有形態的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向 客戶端提供一個接口,使得客戶端在不必指定產品的具體類型的情況下,能夠創建多個產品 族的產品對象。
抽象工廠的角色及其職責
- 抽象工廠(Creator)角色 抽象工廠模式的核心,包含對多個產品結構的聲明,任何工廠類都必須實現這個接口。
- 具體工廠( Concrete Creator)角色 具體工廠類是抽象工廠的一個實現,負責實例化某個產品族中的產品對象。
- 抽象(Product)角色 抽象模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
- 具體產品(ConcreteProduct)角色 抽象模式所創建的具體實例對象
產品組和產品等級結構
工廠模式:要么生產香蕉,要么生產蘋果、要么生產西紅柿;但是不能同時生產一 個產品組。抽象工廠:能同時生產一個產品族
而抽象工廠模式就可以生產一個產品族
產品等級結構:
生產香蕉。蘋果。梨子。但是每種水果都有不同的等級,有的好吃,有的難吃。
產品族
南方香蕉/蘋果/梨子(這是一個產品組)
北方香蕉/蘋果/梨子 (這是另外一個產品族)
抽象工廠模式的實現
#include<iostream>
using namespace std;//抽象蘋果
class AbstractApple{
public:virtual void ShowName() = 0;
};//中國蘋果
class ChinaApple :public AbstractApple{
public:virtual void ShowName(){cout << "中國蘋果" << endl;}
};class USAApple :public AbstractApple{
public:virtual void ShowName(){cout << "美國蘋果" << endl;}
};
class JapanApple :public AbstractApple{
public:virtual void ShowName(){cout << "日本蘋果" << endl;}
};
//抽象香蕉
class AbsrtactBanana{
public:virtual void ShowName() = 0;
};//中國香蕉
class ChinaBanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "中國香蕉" << endl;}
};
class USABanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "美國香蕉" << endl;}
};
class JapanBanana :public AbsrtactBanana{
public:virtual void ShowName(){cout << "日本香蕉" << endl;}
};//抽象的梨子
class AbsrtactPear{
public:virtual void ShowName() = 0;
};//中國梨子
class ChinaPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "中國梨子" << endl;}
};
//美國梨子
class USAPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "美國梨子" << endl;}
};
//日本梨子
class JapanPear :public AbsrtactPear{
public:virtual void ShowName(){cout << "日本梨子" << endl;}
};//抽象工廠 針對產品族
class AbstractFactoty{
public:virtual AbstractApple *CreateApple() = 0;virtual AbsrtactBanana *CreateBanana() = 0;virtual AbsrtactPear* CreatePear() = 0;
};//中國工廠
class ChinaFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new ChinaApple;}virtual AbsrtactBanana *CreateBanana(){return new ChinaBanana;}virtual AbsrtactPear* CreatePear() {return new ChinaPear;}
};
//美國工廠
class USAFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new USAApple;}virtual AbsrtactBanana *CreateBanana(){return new USABanana;}virtual AbsrtactPear* CreatePear() {return new USAPear;}
};
//日本工廠
class JapanFactory :public AbstractFactoty{
public:virtual AbstractApple *CreateApple(){return new JapanApple;}virtual AbsrtactBanana *CreateBanana(){return new JapanBanana;}virtual AbsrtactPear* CreatePear() {return new JapanPear;}
};void test01(){AbstractFactoty *factory = NULL;AbstractApple *apple = NULL;AbsrtactBanana *banana = NULL;AbsrtactPear *pear = NULL;//中國工廠factory = new ChinaFactory; apple = factory->CreateApple();banana = factory->CreateBanana();pear = factory->CreatePear();apple->ShowName();banana->ShowName();pear->ShowName();delete apple;delete banana;delete pear;
}int main(void){test01();system("pause");return 0;
}