工厂方法模式与抽象工厂模式

news/2024/12/2 17:06:50/

首先是一个工厂方法模式

#include <iostream>
#include <string>
using namespace std;// 抽象产品类
class Car {
public:virtual void Run() = 0; // 纯虚函数,定义产品接口virtual ~Car() {} // 虚析构函数,保证多态删除
};// 具体产品类:宝马
class BMWCar : public Car {
public:void Run() override {cout << "I am BMW" << endl;}
};// 具体产品类:奥迪
class AoDiCar : public Car {
public:void Run() override {cout << "I am Audi" << endl;}
};// 抽象工厂类
class CarFactory {
public:virtual Car* CreateCar() = 0; // 纯虚函数,定义工厂接口
};// 具体工厂类:生产宝马的工厂
class BMWFactory : public CarFactory {
public:Car* CreateCar() override {return new BMWCar();}
};// 具体工厂类:生产奥迪的工厂
class AoDiFactory : public CarFactory {
public:Car* CreateCar() override {return new AoDiCar();}
};int main() {// 客户端代码CarFactory* carFactory1 = new BMWFactory(); // 创建一个宝马工厂Car* car1 = carFactory1->CreateCar(); // 通过工厂创建宝马汽车car1->Run(); // 运行宝马汽车CarFactory* carFactory2 = new AoDiFactory(); // 创建一个奥迪工厂Car* car2 = carFactory2->CreateCar(); // 通过工厂创建奥迪汽车car2->Run(); // 运行奥迪汽车// 释放内存delete car1;delete carFactory1;delete car2;delete carFactory2;return 0;
}

以下是抽象工厂模式
要将上述代码从工厂方法模式改为抽象工厂模式,我们需要引入一个额外的抽象层,以便能够创建不同类型的汽车部件(而不仅仅是汽车本身)。在抽象工厂模式中,一个工厂类负责创建一系列相关或相互依赖的对象,而无需明确指定它们的具体类。

以下是一个简化的抽象工厂模式示例,其中我们假设汽车有两个部件:发动机(Engine)和轮胎(Tire)。我们将创建这些部件的抽象类,并为宝马和奥迪分别提供具体的实现。然后,我们将创建一个抽象工厂来定义创建这些部件的方法,并为宝马和奥迪提供具体的工厂实现。

首先,我们定义抽象产品类:

cpp
#include
#include
using namespace std;

// 抽象产品类:发动机
class Engine {
public:
virtual void Start() = 0; // 纯虚函数,定义产品接口
virtual ~Engine() {} // 虚析构函数,保证多态删除
};

// 抽象产品类:轮胎
class Tire {
public:
virtual void Rotate() = 0; // 纯虚函数,定义产品接口
virtual ~Tire() {} // 虚析构函数,保证多态删除
};

// 具体产品类:宝马发动机
class BMWEngine : public Engine {
public:
void Start() override {
cout << “BMW Engine Starts” << endl;
}
};

// 具体产品类:宝马轮胎
class BMWTire : public Tire {
public:
void Rotate() override {
cout << “BMW Tires Rotate” << endl;
}
};

// 具体产品类:奥迪发动机
class AudiEngine : public Engine {
public:
void Start() override {
cout << “Audi Engine Starts” << endl;
}
};

// 具体产品类:奥迪轮胎
class AudiTire : public Tire {
public:
void Rotate() override {
cout << “Audi Tires Rotate” << endl;
}
};
接下来,我们定义抽象工厂类:

cpp
// 抽象工厂类
class CarFactory {
public:
virtual Engine* CreateEngine() = 0; // 纯虚函数,定义工厂接口
virtual Tire* CreateTire() = 0; // 纯虚函数,定义工厂接口
};
然后,我们为宝马和奥迪提供具体的工厂实现:

cpp
// 具体工厂类:宝马工厂
class BMWFactory : public CarFactory {
public:
Engine* CreateEngine() override {
return new BMWEngine();
}

Tire* CreateTire() override {return new BMWTire();
}

};

// 具体工厂类:奥迪工厂
class AudiFactory : public CarFactory {
public:
Engine* CreateEngine() override {
return new AudiEngine();
}

Tire* CreateTire() override {return new AudiTire();
}

};
最后,在客户端代码中,我们使用工厂来创建汽车部件:

cpp
int main() {
// 客户端代码
CarFactory* bmwFactory = new BMWFactory(); // 创建一个宝马工厂
Engine* bmwEngine = bmwFactory->CreateEngine(); // 通过工厂创建宝马发动机
Tire* bmwTire = bmwFactory->CreateTire(); // 通过工厂创建宝马轮胎

bmwEngine->Start(); // 启动宝马发动机
bmwTire->Rotate();  // 让宝马轮胎旋转CarFactory* audiFactory = new AudiFactory(); // 创建一个奥迪工厂
Engine* audiEngine = audiFactory->CreateEngine(); // 通过工厂创建奥迪发动机
Tire* audiTire = audiFactory->CreateTire();       // 通过工厂创建奥迪轮胎audiEngine->Start(); // 启动奥迪发动机
audiTire->Rotate();  // 让奥迪轮胎旋转// 释放内存(注意:在实际应用中,更推荐使用智能指针来管理内存)
delete bmwEngine;
delete bmwTire;
delete bmwFactory;
delete audiEngine;
delete audiTire;
delete audiFactory;return 0;

}
请注意,在这个示例中,我们没有直接创建一个“汽车”类,而是创建了汽车的部件(发动机和轮胎)。这是因为抽象工厂模式通常用于创建一系列相关的对象,而不是单个对象。在实际应用中,你可能会有一个“汽车”类,它接受发动机和轮胎作为参数,并在其内部使用它们。此外,为了简化示例,我使用了原始指针和手动内存管理。在实际项目中,更推荐使用智能指针(如 std::unique_ptr 或 std::shared_ptr)来自动管理内存。


http://www.ppmy.cn/news/1551803.html

相关文章

java——Spring中的Bean线程安全问题

Spring中的Bean对象是否线程安全取决于多个因素&#xff0c;包括Bean的作用域&#xff08;scope&#xff09;、Bean的实现方式以及如何使用这些Bean。以下是一些关键点来帮助理解Spring中Bean的线程安全性&#xff1a; 1. Bean的作用域 Singleton (默认作用域)&#xff1a;在…

Ardupilot开源无人机之Geek SDK讨论

Ardupilot开源无人机之Geek SDK讨论 1. 源由2. 假设3. 思考3.1 结构构型3.2 有限资源3.3 软硬件构架 4.Ardupilot构架 - 2024kaga Update5. 讨论5.1 话题1&#xff1a;工作模式5.2 话题2&#xff1a;关键要点5.3 话题3&#xff1a;产品设计 6. Geek SDK - OpenFire6.1 开源技术…

云原生周刊:K8s 严重漏洞

云原生周刊&#xff1a;K8s 严重漏洞 开源项目推荐 KitOps KitOps 是一款开源的 DevOps 工具&#xff0c;专为 AI/ML 项目的全生命周期管理而设计&#xff0c;通过将模型、数据集、代码和配置打包并版本化为符合 OCI&#xff08;开放容器标准&#xff09;的工件&#xff0c;…

在WSL 2 (Ubuntu 22.04)安装Docker Ce 启动错误解决

查看WSL版本 在 Windows 命令提示符&#xff08;CMD&#xff09;或 PowerShell 中&#xff0c;你可以使用以下命令来查看已安装的 WSL 发行版及其版本信息&#xff1a; wsl -l -v(base) PS C:\Users\Lenovo> wsl -l -vNAME STATE VERSION * Ubuntu-2…

利用Nginx在服务器上部署你的第一个静态页面

文章目录 序言Nginx常用功能1. 反向代理2.负载均衡轮询加权轮询IP_Hash Nginx配置文件结构安装并部署你的静态网页1. 安装(懒人直接看3)2.查看配置文件3.编写或放入自己的静态页面文件 序言 首先我们先来认识一下什么是Nginx源码 官网 Nginx (engine x) 是一个高性能的HTTP和…

【笔记】置身事内

文章目录 制度与政府行为财税改革土地财政城投公司与土地金融 宏观现象及影响纵向不平衡与横向不平衡债务问题地方政府债务房价与居民债务 低消费与产能过剩 我国地方政府这些年在推动经济发展的过程中&#xff1a; 重土地、轻人&#xff0c;优点是可以快速推进城市化和基础设施…

Rockchip-linux驱动 --- IIC

文章目录 一、IIC子系统编程&#xff08;一&#xff09;分配并初始化对象&#xff08;二&#xff09;IIC驱动框架&#xff08;三&#xff09;IIC的regmap函数1. 初始化IIC的寄存器映射2. 写入寄存器3.读取寄存器 &#xff08;二&#xff09;打印调试信息 一、IIC子系统编程 &a…

KST-3D01型胎儿超声仿真体模、吸声材料以及超声骨密度仪用定量试件介绍

一、KST-3D01型胎儿超声仿真体模 KST—3D01型胎儿超声体模&#xff0c;采用仿羊水环境中内置胎龄为7个月大仿胎儿设计。用于超声影像系统3D扫描演示装置表面轮廓呈现和3D重建。仿羊水超声影像呈暗回声&#xff08;无回波&#xff09;特性&#xff0c;仿胎儿超声影像呈对比明显…