*除了單例模式和觀察者監聽者模式,本篇再介紹一下工廠模式。。。→_→*
面向對象編程中出現的問題
在面向對象編程中,可能會會由一種父類派生出許許多多的子類。而當我們在使用new實例化一個子類對象之前,也可能需要進行很多提前操作,比如調用其他的方法、獲取相應的參數列表的值、在數據庫中查詢相關信息等
當類型越來越多、名字越來越複雜的時候,每次去實例化一個子類對象時,都要進行很多提前操作,這就導致了出現了大量的可能產生問題的代碼。使得可維護性下降,發生錯誤的時候查詢錯誤、更正錯誤就會變得非常困難
工廠模式的作用
工廠模式的應用實現了代碼的高內聚低耦合,其中定義了創建子類對象的接口,封裝了子類對象的創建過程,這樣我們就不用每次都辛苦的寫一堆實例化子類對象的提前操作
工廠模式的應用也使實例化子類對象的操作延遲到了子類中,因爲只有在子類中可以決定到底實例化哪一個類
工廠模式結構示意圖
代碼實現
#include <iostream>
#include <vld.h>
using namespace std;
//產品父類
class Product
{
public:
virtual ~Product() = 0;
protected:
Product() {};
};
Product::~Product() {}
//產品子類A
class ConcreteProductA : public Product
{
public:
~ConcreteProductA() {}
ConcreteProductA()
{
cout << "ConcreteProductA..." << endl;
}
};
//產品子類B
class ConcreteProductB : public Product
{
public:
~ConcreteProductB() {}
ConcreteProductB()
{
cout << "ConcreteProductB..." << endl;
}
};
//產品子類C
class ConcreteProductC : public Product
{
public:
~ConcreteProductC() {}
ConcreteProductC()
{
cout << "ConcreteProductC..." << endl;
}
};
//工廠父類
class Factory
{
public:
virtual ~Factory() = 0;
//工廠父類中提供實例化不同產品子類的調用接口,即純虛函數
//在工廠子類中重寫調用接口,多個調用接口的重載以實現實例化不同的產品子類
//這樣就將實例化產品子類對象的操作延遲到了工廠子類中
virtual Product* CreateProduct(int num) = 0;
protected:
Factory() {}
};
Factory::~Factory() {}
//工廠子類
class ConcreteFactory : public Factory
{
public:
~ConcreteFactory() {}
ConcreteFactory()
{
cout << "ConcreteFactory..." << endl;
}
//工廠子類中提供了實例化產品子類的調用接口
//很好地將提前操作封裝起來,實現代碼的高內聚低耦合,提高了代碼的可維護性和可擴展性
//可以通過參數switch不同的產品子類的實例化調用接口
Product* CreateProduct(int num)
{
switch (num)
{
case 0:
return new ConcreteProductA();
break;
case 1:
return new ConcreteProductB();
break;
case 2:
return new ConcreteProductC();
break;
default:
break;
}
}
};
int main()
{
Factory* fac = new ConcreteFactory();//創建工廠子類
//利用工廠子類提供的調用接口實例化某一種產品對象
Product* pA = fac->CreateProduct(0);
Product* pB = fac->CreateProduct(1);
Product* pC = fac->CreateProduct(2);
delete pA;
delete pB;
delete pC;
delete fac;
return 0;
}
運行結果
*碼完。。。收工。。。→_→*