簡單工廠模式不是一個標準的設計模式,但卻十分常用,
目錄
- 1. 簡單工廠的概念
- 2. 簡單工廠的優缺點
- 3. 何時選用簡單工廠?
1. 簡單工廠的概念
提供一個創建物件的實體的功能,而無需關心其具體的實作;被創建的型別可以是介面、抽象類、也可以是具體的類,
簡單工廠的本質是:選擇實作,
重點在選擇,實作已經做好了的;而實作是在實作類中實作的,不是在簡單工廠中實作的,
簡單工廠的主要目的:在于為客戶端來選擇相應的實作,從而使得客戶端和實作之間解耦;如果當具體實作發生變化時,就不會變動客戶端,這個變化會被簡單工廠吸收和屏蔽掉,
簡單工廠中,只會暴露介面和簡單工廠給客戶端,而實作類,是不會暴露給客戶端的,

看代碼可能會好看一點:
class API//api介面
{
public:
virtual void Show(const string& s) = 0;//抽象類
};
class ImplA : public API//實作類A
{
public:
virtual void Show(const string& s) override
{
cout << "ImplA : " << s << endl;
}
};
class ImplB : public API//實作類B
{
public:
virtual void Show(const string& s) override
{
cout << "ImplB : " << s << endl;
}
};
class Factory//簡單工廠
{
public:
//回傳一個API物件,宣告為static,可直接使用類名 + 作用域限定符訪問
static API* CreateObject(int choice)
{
switch (choice)
{
case 1 :
return new ImplA;
case 2 :
return new ImplB;
default:
return nullptr;
}
}
};
int main()
{
shared_ptr<API> api(Factory::CreateObject(1));
// 創建一個API物件,這里使用了智能指標,避免記憶體泄漏
api->Show("dont worry, this is a simple test");
return 0;
}
程式輸出結果為:

2. 簡單工廠的優缺點
優點:
- 幫助封裝:讓組件外部能夠真正面向介面編程;
- 解耦:通過簡單工廠,實作了客戶端和具體實作類的解耦;客戶端根本不知道具體是誰來實作的,也不知道具體如何實作的,客戶端只知道通過工廠獲取它需要的介面物件;
缺點:
- 可能增加客戶端復雜度:如果通過客戶端的引數來選擇具體的實作類,那么就必須讓客戶端能理解各個引數所代表的具體功能和含義,這樣會增加客戶端使用的難度,也會暴露部分內部實作,這種情況下,可使用組態檔的方式來實作;
- 不方便擴展子工廠:使用靜態方法來創建介面,就不能通過寫簡單工廠類的子類來改變創建介面的方法的行為了,一般不會為簡單工廠創建子類,
3. 何時選用簡單工廠?
- 如果想要完全封裝隔離具體實作,讓外部只能通過介面來操作封裝體,那么可以選用簡單工廠,讓客戶端通過工廠來獲取相應的介面類,而無需關心具體的實作;
- 如果想要把對外創建物件的職責集中管理和控制,可以選用簡單工廠,一個簡單工廠可以創建很多的、不相關的物件,可以把對外創建物件的職責集中到一個簡單工廠中來,從而實作集中管理和控制,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265109.html
標籤:java
