創建型模式
???????抽象工廠模式(Abstract Factory Pattern)是一種創建型設計模式,它提供一個接口,用于創建一系列相關或相互依賴的對象,而無需指定它們具體的類。
????????簡單說,它就像一個 "超級工廠",可以生產一整套配套的產品,而不是單一產品。比如說GUI,在windows平臺使用windows風格,mac使用mac風格。
為什么需要抽象工廠模式?
以電子設備工廠為例,我們可以清晰看到為什么需要抽象工廠模式:
- 產品族管理:每個品牌(蘋果、華為)都有一套配套產品(手機、電腦、平板),抽象工廠確保這些產品能協同工作(如生態互聯)
- 隔離具體實現:用戶不需要知道 "iPhone 15" 的具體細節,只需知道 "這是蘋果手機"
- 輕松切換品牌:從蘋果全家桶換成華為全家桶時,只需更換工廠,無需修改使用產品的代碼
- 符合開閉原則:新增小米工廠時,無需修改現有代碼,只需實現新的工廠和產品
示例
? ? ? ? 看代碼是最好理解的方法。可以看到,這里是多個工廠,每個工廠對應多個不同的設備的。
#include <iostream>
#include <string>// 抽象產品:手機
class Phone {
public:virtual ~Phone() = default;virtual std::string getName() const = 0;
};// 抽象產品:電腦
class Computer {
public:virtual ~Computer() = default;virtual std::string getName() const = 0;
};// 抽象產品:平板
class Tablet {
public:virtual ~Tablet() = default;virtual std::string getName() const = 0;
};// 具體產品:蘋果手機
class IPhone : public Phone {
public:std::string getName() const override {return "iPhone 15";}
};// 具體產品:蘋果電腦
class Mac : public Computer {
public:std::string getName() const override {return "MacBook Pro";}
};// 具體產品:蘋果平板
class IPad : public Tablet {
public:std::string getName() const override {return "iPad Pro";}
};// 具體產品:華為手機
class HuaweiPhone : public Phone {
public:std::string getName() const override {return "Huawei Mate 60";}
};// 具體產品:華為電腦
class HuaweiComputer : public Computer {
public:std::string getName() const override {return "Huawei MateBook X Pro";}
};// 具體產品:華為平板
class HuaweiTablet : public Tablet {
public:std::string getName() const override {return "Huawei MatePad Pro";}
};// 抽象工廠:電子設備工廠
class ElectronicFactory {
public:virtual ~ElectronicFactory() = default;virtual Phone* createPhone() const = 0;virtual Computer* createComputer() const = 0;virtual Tablet* createTablet() const = 0;
};// 具體工廠:蘋果工廠
class AppleFactory : public ElectronicFactory {
public:Phone* createPhone() const override {return new IPhone();}Computer* createComputer() const override {return new Mac();}Tablet* createTablet() const override {return new IPad();}
};// 具體工廠:華為工廠
class HuaweiFactory : public ElectronicFactory {
public:Phone* createPhone() const override {return new HuaweiPhone();}Computer* createComputer() const override {return new HuaweiComputer();}Tablet* createTablet() const override {return new HuaweiTablet();}
};// 客戶端代碼:使用電子設備
void useElectronicDevices(const ElectronicFactory& factory) {Phone* phone = factory.createPhone();Computer* computer = factory.createComputer();Tablet* tablet = factory.createTablet();std::cout << "使用的電子設備:" << std::endl;std::cout << "- 手機:" << phone->getName() << std::endl;std::cout << "- 電腦:" << computer->getName() << std::endl;std::cout << "- 平板:" << tablet->getName() << std::endl;delete phone;delete computer;delete tablet;
}int main() {// 使用蘋果設備std::cout << "=== 蘋果生態 ===" << std::endl;AppleFactory appleFactory;useElectronicDevices(appleFactory);// 切換到華為設備,無需修改useElectronicDevices函數std::cout << "\n=== 華為生態 ===" << std::endl;HuaweiFactory huaweiFactory;useElectronicDevices(huaweiFactory);return 0;
}