為了提高內聚和松聚合,抽象出一些類的公共介面以形成抽象基類,然後宣告基類指標指向派生類物件,以達到多型的目的。當有很多派生類繼承自該抽象基類時,需要寫很多new
,而且客戶必須知道派生類的名稱才能生成該物件,如果不知道要例項化哪乙個具體的派生類,也就無法使用new
。
工廠模式的兩大功能:
- 定義建立物件的介面,封裝了物件的建立;
-將具體化類的工作延遲到了派生類中;
結構示意圖如下:
完整**
#ifndef _product_h_
#define _product_h_
#include
class product //遮蔽建構函式
};class concreteproduct : public product
concreteproduct()
};product::~product() {}
#endif //_product_h_
#ifndef _factory_h_
#define _factory_h_
#include "product.h"
//class product;
class factory
};class concretefactory : public factory
concretefactory()
product* createproduct()
};factory::~factory(){}
#endif // _factory_h_
#include "factory.h"
using namespace std;
int main()
執行結果:
分析一下**:
類product即抽象出來的基類,類concreteproduct是其派生類是真實需要創造的產品,其建構函式的動作即為生成產品例項;類factory中的函式createproduct()
是乙個純虛函式(純介面)返回的是product*,在其派生類concretefactory中,則實現了這個介面,這個介面封裝了物件的建立。最後在factory-test.cpp中就可以使用多型來建立concreteproduct物件。要創造不同的產品,只需要將類factory中的createproduct()
傳遞乙個引數,這個引數來決定要建立哪乙個具體的product。
工廠模式僅僅適用於多個類繼承自乙個公共的基類,如果需要為不同的類的子類建立物件,就要使用抽象工廠模式了。
抽象工廠模式和工廠模式類似,其結構示意圖如下:
完整的**實現:
#ifndef _product_h_
#define _product_h_
#include
class abstractproducta //遮蔽建構函式
};abstractproducta::~abstractproducta() {}
class abstractproductb //遮蔽建構函式
};abstractproductb::~abstractproductb() {}
class producta1 : public abstractproducta
producta1()
};class producta2 : public abstractproducta
producta2()
};class productb1 : public abstractproductb
productb1()
};class productb2 : public abstractproductb
productb2()
};#endif //_product_h_
#ifndef _abstractfactory_h_
#define _abstractfactory_h_
#include "product.h"
class abstractfactory
};abstractfactory::~abstractfactory() {}
abstractproducta* abstractfactory::createproducta() {}
abstractproductb* abstractfactory::createproductb() {}
class concretefactory1 : public abstractfactory
abstractproducta* createproducta()
abstractproductb* createproductb()
};concretefactory1::~concretefactory1() {}
class concretefactory2 : public abstractfactory
abstractproducta* createproducta()
abstractproductb* createproductb()
};concretefactory2::~concretefactory2() {}
#endif // _abstractfactory_h_
#include "product.h"
#include "abstractfactory.h"
using namespace std;
int main()
輸出結果如下:
簡單分析:
抽象產品基類abstractproducta
,abstractproductb
,四個繼承的產品子類producta1,producta2
,productb1,productb2
,乙個抽象工廠基類abstractfactory
,以及對應的兩個繼承的子類concretefactory1, concretefactory2
,通過這兩個繼承子類中重寫了的基類的純虛方法:createproducta,createproductb
方法來進行產品類的建立,利用多型,直接使用工廠基類的指標呼叫該方法即可。
抽象工廠模式和工廠模式的原理是一樣的,都是封裝了物件的建立,並且將例項化物件的任務交給了子類,不同點在於:工廠模式只為一類物件提供建立介面或延遲物件的建立到子類,而抽象工廠模式則為一組(多個類)相關或者依賴的物件提供建立介面或延遲物件的建立到子類
設計模式 設計模式之工廠模式
工廠方法模式 建立模式 使用場景?作用?形態?場景 大量類似的實體類 要建立的實體類都是同一本質的東西 披薩 有部分類似功能 準備 烘烤 切法 實現方式不一樣 準備的材料不同 烘烤時間不同 切法不同 將繁瑣複雜的建立類的過程聚集在一起,有序清晰 把具體例項化的過程從客戶 中抽離 作用 1 將建立物件...
c 設計模式 之 工廠模式之 工廠模式
1 uml類圖 實現和依賴關係 實現 sportfactory jeepfactory hatchbackfactory 實現 ifactory 介面 sportcar jeepcar hatchbackcar 實現 icar 介面 依賴 ifactory 依賴 icar sportfactory ...
設計模式 工廠模式之簡單工廠模式
定義 由乙個工廠物件 工廠類 來指定建立某乙個產品類的例項。使用場景 客戶端只需傳入指定的引數即可,工廠類負責建立的物件較少 因為指定了傳入的引數 介面類 本想用iphone命名的,見諒 public inte ce phone實現介面類 public class huaweiphone imple...