沈陽網(wǎng)站建設(shè)推廣南京seo網(wǎng)絡(luò)推廣
UML圖與工廠模式
- UML圖
- 設(shè)計(jì)模式三原則
- 簡單工廠模式
- 工廠模式
UML圖
??類封裝了數(shù)據(jù)和行為,是面向?qū)ο蟮闹匾M成部分,它是具有相同屬性、操作、關(guān)系的對象集合的總稱
有以下UML圖,分析如下:

?
- 可見性:
+
表示public
、#
表示protected
、-
表示private
、__
(下劃線)表示static
- 屬性的表示方式:【可見性】【屬性名稱】:【類型】= { 缺省值,可選 }
- 方法的表示方式:【可見性】【方法名稱】(【參數(shù)名 : 參數(shù)類型,……】):【返回值類型】
定義的類是一個(gè)抽象類(類中有純虛函數(shù)),在畫UML類圖的時(shí)候,類名需要使用斜體顯示,并在最后給函數(shù)指定=0。

設(shè)計(jì)模式三原則
單一職責(zé)原則
- 核心思想: ??一個(gè)類應(yīng)該只有一個(gè)引起它變化的原因??(即一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé))
- 通俗理解: 即一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé),一個(gè)類不要 “身兼數(shù)職”
- 關(guān)鍵點(diǎn): 將不同職責(zé)分離到不同的類中,職責(zé)分離
開閉原則
- 核心思想: 軟件實(shí)體(類、模塊、函數(shù))應(yīng)對擴(kuò)展開放,對修改關(guān)閉??
- 通俗理解??: 新增功能時(shí)盡量通過擴(kuò)展(如繼承、組合)實(shí)現(xiàn),而非修改已有代碼
里氏替換原則
- 核心思想: 子類必須能夠替換父類且不影響程序的正確性??
- ??通俗理解??: 子類要能包含父類的所有屬性和方法
三者關(guān)系與總結(jié)??
原則 | 核心目標(biāo) | 實(shí)現(xiàn)手段 |
---|---|---|
??單一職責(zé)(SRP)? | 高內(nèi)聚、低耦合 | 拆分職責(zé)到不同類 |
??開閉原則(OCP) | 可擴(kuò)展性,減少修改風(fēng)險(xiǎn) | 依賴抽象,使用多態(tài)/組合 |
??里氏替換(LSP)? | ? 保證繼承體系的正確性 | 合理設(shè)計(jì)父子類契約 |
簡單工廠模式
提供一個(gè)靜態(tài)方法或普通方法,根據(jù)輸入?yún)?shù)(如類型標(biāo)識)決定創(chuàng)建并返回哪種具體類的實(shí)例。
- 工廠類(SimpleFactory)??:負(fù)責(zé)創(chuàng)建具體產(chǎn)品,包含判斷邏輯。
- ??抽象產(chǎn)品(Product)??:定義產(chǎn)品的公共接口(通常是抽象類或接口)
- 具體產(chǎn)品(ConcreteProduct)??:實(shí)現(xiàn)抽象產(chǎn)品的具體類。
簡單工廠模式相關(guān)類的創(chuàng)建和使用步驟如下:
- 定義一個(gè)抽象產(chǎn)品基類Product,作為各個(gè)對象的基類,
- 創(chuàng)建一個(gè)工廠類,并且為工廠類添加公共成員函數(shù),通過這個(gè)函數(shù)來創(chuàng)建我們需要的對象,這個(gè)函數(shù)稱為工廠函數(shù)。簡單工廠需要的工廠類只只有一個(gè)。
- 關(guān)于工廠函數(shù),返回的是基類指針,以此實(shí)現(xiàn)多態(tài),函數(shù)體則根據(jù)不同的枚舉類型創(chuàng)建不同的對象實(shí)例
- 關(guān)于使用,首先創(chuàng)建一個(gè)工廠類對象,然后通過這個(gè)對象調(diào)用工廠函數(shù),這樣就可以生產(chǎn)出一個(gè)指定類型的實(shí)例對象了。
相關(guān)UML類圖與實(shí)例代碼如下:

#include <bits/stdc++.h>using namespace std;// 從而實(shí)現(xiàn)對象的解耦合, 同時(shí)增強(qiáng)了程序的擴(kuò)展性
// 抽象產(chǎn)品接口
class Product {
public:virtual ~Product() = default;virtual void operation() const = 0;
};// 具體產(chǎn)品類A
class ConcreteProductA : public Product {
public:void operation() const override {cout << "ConcreteProductA operation" << endl;}
};// 具體產(chǎn)品類B
class ConcreteProductB : public Product {
public:void operation() const override {cout << "ConcreteProductB operation" << endl;}
};// 工廠類
class SimpleFactory {
public:static Product* createProduct(char type) {switch(type){case 'A': return new ConcreteProductA(); break;case 'B': return new ConcreteProductB(); break;default: break;}}
};// 客戶端代碼
int main() {char type;cout << "Enter product type (A or B): ";cin >> type;Product* product = SimpleFactory::createProduct(type);product->operation();delete product; // 手動(dòng)釋放內(nèi)存return 0;
}
說明:
- 基類的析構(gòu)函數(shù)應(yīng)該是虛函數(shù),這樣才能夠通過父類指針或引用析構(gòu)子類的對象。
- 工廠函數(shù)返回值為基類指針,指向子類對象的地址,實(shí)現(xiàn)多態(tài)
- 簡單工廠模式的工廠函數(shù)是違背了開閉原則的
工廠模式
??在上面的簡單工廠模式的工廠函數(shù)中需要?jiǎng)?chuàng)建不同的實(shí)例對象,現(xiàn)在如果想要生成更多實(shí)例對象,那么就需要在工廠函數(shù)的switch語句中添加更多的case,很明顯這違背了封閉原則,也就意味著需要基于開放原則來解決這個(gè)問題。
簡單工廠模式是只有一個(gè)工廠類,而工廠模式是有很多的工廠類:
- 一個(gè)基類,包含一個(gè)虛工廠函數(shù),用于實(shí)現(xiàn)多態(tài)。
- 多個(gè)子類,重寫父類的工廠函數(shù)。每個(gè)子工廠類負(fù)責(zé)生產(chǎn)一種產(chǎn)品的實(shí)例對象,這相當(dāng)于再次解耦,將工廠類的職責(zé)再次拆分、細(xì)化,如果要生產(chǎn)新品種的惡魔果實(shí),那么只需要添加對應(yīng)的工廠類,無需修改原有的代碼。
相關(guān)UML類圖與實(shí)例代碼如下:

#include <iostream>
using namespace std;// 抽象產(chǎn)品接口
class Product {
public:virtual ~Product() = default;virtual void operation() const = 0;
};// 具體產(chǎn)品類A
class ConcreteProductA : public Product {
public:void operation() const override {cout << "ConcreteProductA operation" << endl;}
};// 具體產(chǎn)品類B
class ConcreteProductB : public Product {
public:void operation() const override {cout << "ConcreteProductB operation" << endl;}
};// 工廠接口
class Factory {
public:virtual ~Factory() = default;virtual Product* createProduct() const = 0;
};// 具體工廠類A
class ConcreteFactoryA : public Factory {
public:Product* createProduct() const override {return new ConcreteProductA();}
};// 具體工廠類B
class ConcreteFactoryB : public Factory {
public:Product* createProduct() const override {return new ConcreteProductB();}
};// 客戶端代碼
int main() {char type;cout << "Enter product type (A or B): ";cin >> type;Factory* factory = nullptr;if (type == 'A') {factory = new ConcreteFactoryA();} else if (type == 'B') {factory = new ConcreteFactoryB();} else {cerr << "Unknown product type" << endl;return 1;}Product* product = factory->createProduct();product->operation();delete product; // 手動(dòng)釋放產(chǎn)品對象delete factory; // 手動(dòng)釋放工廠對象return 0;
}
??在真實(shí)的項(xiàng)目場景中,要生成什么類型的具體產(chǎn)品(ConcreteProductA/B)其實(shí)是通過客戶端的操作界面控制的,它對應(yīng)的可能是一個(gè)按鈕或者是一個(gè)選擇列表,用戶做出了選擇,程序就可以根據(jù)該需求去創(chuàng)建對應(yīng)的工廠對象,最終將選擇的具體產(chǎn)品生產(chǎn)出來。