前言
本篇文章正式帶大家來學(xué)習(xí)C++中的設(shè)計(jì)模式,這篇文章主要帶大家學(xué)習(xí)工廠模式。
一、什么是工廠模式
工廠模式(Factory Pattern)是一種創(chuàng)建型設(shè)計(jì)模式,它提供了一種創(chuàng)建對象的接口,但將具體對象的實(shí)例化延遲到子類或具體工廠類中。工廠模式通過解耦客戶端代碼和創(chuàng)建具體對象的過程,使客戶端代碼不需要直接依賴于具體對象的創(chuàng)建方式,而是通過工廠來創(chuàng)建對象,從而提高代碼的靈活性和可維護(hù)性。
在C++中,工廠模式可以有多種實(shí)現(xiàn)方式,包括簡單工廠模式、工廠方法模式和抽象工廠模式。
UML結(jié)構(gòu)圖:
二、簡單工廠模式
簡單工廠模式通過一個(gè)工廠類來封裝對象的創(chuàng)建過程??蛻舳烁鶕?jù)不同的參數(shù)傳遞給工廠類,工廠類根據(jù)參數(shù)的不同來創(chuàng)建不同的具體對象。簡單工廠模式的一大優(yōu)勢是將對象的創(chuàng)建邏輯集中到一個(gè)工廠類中,客戶端代碼只需要與工廠類進(jìn)行交互,而不需要直接與具體對象進(jìn)行交互。
示例代碼:
#include <iostream>
using namespace std;
// 抽象產(chǎn)品接口
class Product
{
public:
virtual void use() = 0;
};
// 具體產(chǎn)品類A
class ConcreteProductA : public Product
{
public:
void use()
{
cout << "Using ConcreteProductA\n";
}
};
// 具體產(chǎn)品類B
class ConcreteProductB : public Product
{
public:
void use()
{
cout << "Using ConcreteProductB\n";
}
};
//工廠類
class Factory
{
public:
static Product* CreateProduct(int type)
{
if (type == 1)
{
return new ConcreteProductA();
}
else if (type == 2)
{
return new ConcreteProductB();
}
else
{
return NULL;
}
}
};
int main(void)
{
Product* productA = Factory::CreateProduct(1);
productA->use();
Product* productB = Factory::CreateProduct(2);
productB->use();
delete productA;
delete productB;
return 0;
}
三、簡單工廠模式優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):
將對象的創(chuàng)建邏輯集中到了一個(gè)工廠類中,客戶端只需要與工廠類進(jìn)行交互,而無需關(guān)注具體對象的創(chuàng)建過程,降低了客戶端代碼的復(fù)雜性。
客戶端代碼與具體對象解耦,可以通過工廠類創(chuàng)建不同的對象,而無需修改客戶端代碼,提高了代碼的靈活性和可擴(kuò)展性。
客戶端代碼只需要知道抽象產(chǎn)品接口,而無需了解具體產(chǎn)品的細(xì)節(jié),實(shí)現(xiàn)了依賴倒置原則。
可以隱藏具體產(chǎn)品的實(shí)現(xiàn)細(xì)節(jié),提高了代碼的安全性。
缺點(diǎn):
違反了開閉原則,對于每個(gè)新增的具體產(chǎn)品,都需要修改工廠類的創(chuàng)建邏輯,可能導(dǎo)致工廠類的代碼過于臃腫。
工廠類集中了所有的對象創(chuàng)建邏輯,當(dāng)有多個(gè)具體產(chǎn)品時(shí),工廠類的代碼會變得復(fù)雜,不易于維護(hù)和擴(kuò)展。
簡單工廠模式中的工廠類負(fù)責(zé)創(chuàng)建所有具體產(chǎn)品,當(dāng)新增具體產(chǎn)品時(shí),工廠類會變得臃腫,不符合單一職責(zé)原則。
四、簡單工廠適用場景
1.對象的創(chuàng)建邏輯相對簡單:當(dāng)需要?jiǎng)?chuàng)建的對象邏輯比較簡單,不涉及復(fù)雜的條件判斷或算法時(shí),可以使用簡單工廠模式。
2.需要對客戶端代碼隱藏具體對象的創(chuàng)建細(xì)節(jié):通過簡單工廠模式,客戶端只需要與工廠類進(jìn)行交互,而不需要直接與具體對象進(jìn)行交互,可以實(shí)現(xiàn)對具體對象的創(chuàng)建細(xì)節(jié)進(jìn)行封裝和隱藏。
3.需要根據(jù)不同的參數(shù)創(chuàng)建不同的對象:當(dāng)需要根據(jù)不同的參數(shù)或配置來選擇創(chuàng)建不同的具體對象時(shí),可以使用簡單工廠模式??蛻舳酥恍枰o定相應(yīng)的參數(shù),工廠類根據(jù)參數(shù)的不同來創(chuàng)建對應(yīng)的對象。
4.對象的數(shù)量相對穩(wěn)定:如果系統(tǒng)中的對象數(shù)量固定且不經(jīng)常變化,不需要頻繁地添加新的具體對象,簡單工廠模式可以簡化對象的創(chuàng)建和管理。
五、簡單工廠類的使用
在Qt中,使用工廠模式可以實(shí)現(xiàn)創(chuàng)建和管理各種對象的過程,尤其在UI編程中非常常見。以下是一個(gè)簡單的示例,展示了如何在Qt中使用工廠模式來創(chuàng)建不同類型的窗口:
首先,我們需要定義一個(gè)抽象窗口類(AbstractWindow)作為工廠的產(chǎn)品接口,用于表示不同類型的窗口對象。
class AbstractWindow : public QWidget
{
public:
virtual void display() = 0;
};
接下來,我們可以創(chuàng)建具體的窗口類(例如:MainWindow、DialogWindow、PopupWindow)繼承自抽象窗口類,并實(shí)現(xiàn)其相應(yīng)的方法。
class MainWindow : public AbstractWindow
{
public:
void display() override
{
// 實(shí)現(xiàn)MainWindow的顯示邏輯
}
};
class DialogWindow : public AbstractWindow
{
public:
void display() override
{
// 實(shí)現(xiàn)DialogWindow的顯示邏輯
}
};
class PopupWindow : public AbstractWindow
{
public:
void display() override
{
// 實(shí)現(xiàn)PopupWindow的顯示邏輯
}
};
接下來,我們需要?jiǎng)?chuàng)建一個(gè)窗口工廠類(WindowFactory),用于根據(jù)不同的參數(shù)創(chuàng)建相應(yīng)類型的窗口對象。
class WindowFactory
{
public:
static AbstractWindow* createWindow(const QString& windowType)
{
if (windowType == "MainWindow")
{
return new MainWindow();
}
else if (windowType == "DialogWindow")
{
return new DialogWindow();
}
else if (windowType == "PopupWindow")
{
return new PopupWindow();
}
return nullptr;
}
};
在客戶端代碼中,我們可以使用窗口工廠類來創(chuàng)建具體的窗口對象。
QString windowType = "MainWindow"; // 可以根據(jù)需求指定不同的窗口類型
AbstractWindow* window = WindowFactory::createWindow(windowType);
if (window)
{
window->display();
delete window;
}
通過上述代碼,我們可以根據(jù)不同的窗口類型使用工廠模式創(chuàng)建相應(yīng)的窗口對象,并執(zhí)行其特定的顯示邏輯。
在這個(gè)例子中,抽象窗口類充當(dāng)了工廠的產(chǎn)品接口,具體窗口類是工廠所創(chuàng)建的產(chǎn)品,而窗口工廠類則是具體實(shí)現(xiàn)工廠模式的類。通過使用工廠模式,我們能夠有效地解耦了窗口對象的創(chuàng)建和使用過程,并使得程序更具靈活性和可擴(kuò)展性。文章來源:http://www.zghlxwxcb.cn/news/detail-671611.html
總結(jié)
本篇文章就講解到這里。文章來源地址http://www.zghlxwxcb.cn/news/detail-671611.html
到了這里,關(guān)于C++設(shè)計(jì)模式(工廠模式)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!