c++注意点(13)----设计模式(抽象工厂)
·
创建型模式
抽象工厂模式(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;
}
更多推荐

所有评论(0)