工廠模式
參考:https://www.cnblogs.com/huiz/p/8232783.html
1、簡單工廠模式
在工廠類做判斷,從而創建相應的產品,當增加產品時需要修改工廠類。
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
//簡單工廠模式
//枚舉
enum cartype{benci,baoma};
//抽象類(多態:提高基類)
class car{
public:
virtual void createcar(void)=0;
};
//具體類(產品1)
class bencicar:public car{
public:
bencicar(){
cout<<" begin create bencicar "<<endl;
}
void createcar(void){
cout<<" creating bencicar "<<endl;
}
~bencicar(){}
};
//具體類(產品2)
class baomacar:public car{
public:
baomacar(){
cout<<" begin create baomacar "<<endl;
}
void createcar(void){
cout<<" creating baomacar "<<endl;
}
~baomacar(){}
};
//工廠類
class carfactory{
public:
car* createSpecificCar(cartype type){
switch(type){
case benci:
return (new bencicar());
break;
case baoma:
return (new baomacar());
break;
default:
return NULL;
break;
}
}
};
int main(){
carfactory producecar;
car *newcar1 = producecar.createSpecificCar(benci);
car *newcar2 = producecar.createSpecificCar(baoma);
newcar1->createcar();
newcar2->createcar();
return 0;
}
2、工廠方法模式
抽象工廠類,只提供一個接口,通過子類去擴展和實現
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
//工廠方法模式
//抽象類(多態:提高基類)
class car{
public:
virtual void createcar(void)=0;
};
//具體類(產品1)
class bencicar:public car{
public:
bencicar(){
cout<<" begin create bencicar "<<endl;
}
void createcar(void){
cout<<" creating bencicar "<<endl;
}
~bencicar(){}
};
//具體類(產品2)
class baomacar:public car{
public:
baomacar(){
cout<<" begin create baomacar "<<endl;
}
void createcar(void){
cout<<" creating baomacar "<<endl;
}
~baomacar(){}
};
//抽象工廠類,提供創建產品類的接口
class carfactory{
public:
virtual car* createSpecificCar()=0;
};
//工廠類子類
class bencifactory:public carfactory{
car* createSpecificCar(){
return (new bencicar());
}
};
//工廠類子類
class baomafactory:public carfactory{
car* createSpecificCar(){
return (new baomacar());
}
};
int main(){
carfactory *producecar1 = new bencifactory();
car *newcar1 = producecar1->createSpecificCar();
newcar1->createcar();
carfactory *producecar2 = new baomafactory();
car *newcar2 = producecar2->createSpecificCar();
newcar2->createcar();
return 0;
}
3、抽象工廠模式
當存在多個產品系列,而客戶端只使用一個系列的產品時(選擇普通產品還是高配產品),可以考慮使用抽象工廠模式。
缺點:當增加一個新系列的產品時,不僅需要現實具體的產品類,還需要增加一個新的創建接口,擴展相對困難。
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
//工廠方法模式
//抽象類(多態:提高基類)
class car{
public:
virtual void createcar(void)=0;
};
class highcar{
public:
virtual void createcar(void)=0;
};
//具體類(產品1)
class bencicar:public car{
public:
bencicar(){
cout<<" begin create bencicar "<<endl;
}
void createcar(void){
cout<<" creating bencicar "<<endl;
}
~bencicar(){}
};
//具體類(產品1,高性能)
class highbencicar:public highcar{
public:
highbencicar(){
cout<<" begin create highbencicar "<<endl;
}
void createcar(void){
cout<<" creating highbencicar "<<endl;
}
~highbencicar(){}
};
//具體類(產品2)
class baomacar:public car{
public:
baomacar(){
cout<<" begin create baomacar "<<endl;
}
void createcar(void){
cout<<" creating baomacar "<<endl;
}
~baomacar(){}
};
//具體類(產品2,高性能)
class highbaomacar:public highcar{
public:
highbaomacar(){
cout<<" begin create highbaomacar "<<endl;
}
void createcar(void){
cout<<" creating highbaomacar "<<endl;
}
~highbaomacar(){}
};
//抽象工廠類,提供創建產品類的接口
class carfactory{
public:
virtual car* createSpecificCar()=0;
virtual highcar* createSpecificHightCar()=0;
};
//工廠類子類
class bencifactory:public carfactory{
car* createSpecificCar(){
return (new bencicar());
}
highcar* createSpecificHightCar(){
return (new highbencicar());
}
};
//工廠類子類
class baomafactory:public carfactory{
car* createSpecificCar(){
return (new bencicar());
}
highcar* createSpecificHightCar(){
return (new highbaomacar());
}
};
int main(){
carfactory *producecar1 = new bencifactory();
car *newcar1 = producecar1->createSpecificCar();
newcar1->createcar();
carfactory *producecar2 = new baomafactory();
highcar *newcar2 = producecar2->createSpecificHightCar();
newcar2->createcar();
return 0;
}