簡單工廠模式
簡單工廠模式其實不難理解,我們有一間食品工廠,工廠的流水線用來生產各種口味的薯片。根據市場的要求,流水線需要隨時切換生產的口味。
那麼問題來了。假設不使用任何設計模式,那麼我們應該怎麼做?
假設不使用任何設計模式,那麼我們是不是應該將各種口味的薯片各自封裝成一個函數,然後根據不同的需求調用不同的函數?要調用不同的函數,那麼我們必須要知道代表口味的函數名稱。如果有成百上千中口味呢?
所有,簡單工廠就我個人的理解來說,就是用來統一接口的。
它有兩個主要的類,一個是產品類,這是一個接口類;二是一個工廠類,用來創建相應的對象。同時,還有許許多多的具體產品類,它們繼承產品類,重載產品類的方法,在工廠類中根據需要生產實例。
#include<iostream>
using namespace std;
/* 產品類 */
class AbstractProduct{
public:
virtual void GetName() = 0;
};
/* 具體產品類A */
class ProductA:public AbstractProduct{
public:
void GetName(){
cout << "This is ProductA" << endl;
}
};
/* 具體產品類B */
class ProductB:public AbstractProduct{
public:
void GetName(){
cout << "This is ProductB" << endl;
}
};
/* 工廠類 */
class Factory{
public:
AbstractProduct* GetProduct(int type){
AbstractProduct *product;
/* 通過聲明一個指向基類的指針來指向實際的子類實現,達到了多態的目的。 */
switch(type){
case 1:product = new ProductA();break;
case 2:product = new ProductB();break;
default:product = NULL;break;
}
return product;
}
};
int main(){
Factory *factory = new Factory();
AbstractProduct *product = factory->GetProduct(2);
product->GetName();
return 0;
}
工廠方法模式
工廠方法模式跟簡單工廠模式的區別主要是:一個工廠方法類生成許多具體工廠類,每個具體工廠類只生產一個 具體產品
#include<iostream>
using namespace std;
class AbstractProduct{
public:
virtual void GetName() = 0;
};
class AbstractFactory{
public:
virtual AbstractProduct* GetProduct() = 0;
};
class ProductA : public AbstractProduct{
public:
void GetName(){
cout << "This is ProductA" << endl;
}
};
class ProductB : public AbstractProduct{
public:
void GetName(){
cout << "This is ProductB" << endl;
}
};
class FactoryA : public AbstractFactory{
public:
AbstractProduct* GetProduct(){
return new ProductA();
}
};
class FactoryB : public AbstractFactory{
public:
AbstractProduct* GetProduct(){
return new ProductB();
}
};
int main(){
AbstractFactory *factory = new FactoryA();
AbstractProduct *product = factory->GetProduct();
product->GetName();
FactoryB *factory_b = new FactoryB();
factory_b->GetProduct()->GetName();
return 0;
}
抽象工廠模式
抽象工廠模式跟工廠方法模式類似,從代碼上而言,區別在於抽象類中接口的個數。
#include<iostream>
using namespace std;
class AbstractProduct{
public:
virtual void GetName() = 0;
};
class AbstractFactory{
public:
virtual AbstractProduct* GetProduct() = 0;
};
class ProductA : public AbstractProduct{
public:
void GetName(){
cout << "This is ProductA" << endl;
}
};
class ProductB : public AbstractProduct{
public:
void GetName(){
cout << "This is ProductB" << endl;
}
};
class FactoryA : public AbstractFactory{
public:
AbstractProduct* GetProduct(){
return new ProductA();
}
};
class FactoryB : public AbstractFactory{
public:
AbstractProduct* GetProduct(){
return new ProductB();
}
};
int main(){
AbstractFactory *factory = new FactoryA();
AbstractProduct *product = factory->GetProduct();
product->GetName();
FactoryB *factory_b = new FactoryB();
factory_b->GetProduct()->GetName();
return 0;
}