C++设计模式---工厂模式

        C++中工厂模式是一种创建型设计模式,它允许客户端代码通过调用工厂方法来创建对象,而无需直接使用new运算符实例化具体类。这种模式有助于将类的创建与使用相分离,并且在需要添加新的具体类时可以减少对客户端代码的影响。

        工厂模式通常有两种实现方式:简单工厂模式和抽象工厂模式。简单工厂模式是最基本的工厂模式,它通过一个静态方法来创建具体的对象。而抽象工厂模式则通过一个抽象工厂类来定义一组创建相关对象的方法,每个具体工厂类实现这些方法来创建特定的对象。

1、简单工厂模式

        简单工厂模式是最基本的工厂模式,它通过一个静态方法来创建具体的对象。

#include <iostream>  
#include <string>  // 定义产品接口  【抽象类】
class Product {  
public:  virtual ~Product() {}  virtual void use() const = 0;  // 纯虚函数必须被子类重写
};  // 定义具体产品类  
class ProductA : public Product {  
public:  void use() const override {  std::cout << "Using ProductA" << std::endl;  }  
};  class ProductB : public Product {  
public:  void use() const override {  std::cout << "Using ProductB" << std::endl;  }  
};  // 定义简单工厂类  
class SimpleFactory {  
public:  static Product* createProduct(const std::string& type) {  if (type == "A") {  return new ProductA();  } else if (type == "B") {  return new ProductB();  } else {  return nullptr;  }  }  
};  // 客户端代码  
int main() {  Product* productA = SimpleFactory::createProduct("A");  if (productA) {  productA->use();  delete productA; // 释放内存  }  Product* productB = SimpleFactory::createProduct("B");  if (productB) {  productB->use();  delete productB; // 释放内存  }   return 0;  
}

结果:

Using ProductA
Using ProductB

2、抽象工厂模式

        抽象工厂模式则通过一个抽象工厂类来定义一组创建相关对象的方法,每个具体工厂类实现这些方法来创建特定的对象。

基本结构:

        (1)抽象工厂(AbstractFactory):声明了一组用于创建产品对象的操作接口。

        (2)具体工厂(ConcreteFactory):实现了抽象工厂接口,负责创建具体产品类的对象。

        (3)抽象产品(AbstractProduct):定义了一组产品的接口。

        (4)具体产品(ConcreteProduct):实现了抽象产品接口,是具体可使用的产品。

示例:有两个产品族(Car 和 Bike),每个产品族都有两个具体产品(SportsCarSedan 和 MountainBikeRoadBike)。

#include <iostream>  
#include <string>  // 抽象产品  
class Car {  
public:  virtual ~Car() {}  virtual void show() = 0;  
};  class Bike {  
public:  virtual ~Bike() {}  virtual void show() = 0;  
};  // 具体产品  
class SportsCar : public Car {  
public:  void show() override { std::cout << "SportsCar" << std::endl; }  
};  class Sedan : public Car {  
public:  void show() override { std::cout << "Sedan" << std::endl; }  
};  class MountainBike : public Bike {  
public:  void show() override { std::cout << "MountainBike" << std::endl; }  
};  class RoadBike : public Bike {  
public:  void show() override { std::cout << "RoadBike" << std::endl; }  
};  // 抽象工厂  
class VehicleFactory {  
public:  virtual ~VehicleFactory() {}  virtual Car* createCar() = 0;      // 纯虚函数,必须被子类重写virtual Bike* createBike() = 0;    // 纯虚函数,必须被子类重写
};  // 具体工厂  
class AmericanFactory : public VehicleFactory {  
public:  Car* createCar() override { return new SportsCar(); }  Bike* createBike() override { return new MountainBike(); }  
};  class EuropeanFactory : public VehicleFactory {  
public:  Car* createCar() override { return new Sedan(); }  Bike* createBike() override { return new RoadBike(); }  
};  // 客户端代码  
int main() {  VehicleFactory* americanFactory = new AmericanFactory();  Car* americanCar = americanFactory->createCar();  Bike* americanBike = americanFactory->createBike();  americanCar->show();  americanBike->show();  VehicleFactory* europeanFactory = new EuropeanFactory();  Car* europeanCar = europeanFactory->createCar();  Bike* europeanBike = europeanFactory->createBike();  europeanCar->show();  europeanBike->show();  // 记得释放内存  delete americanCar;  delete americanBike;  delete europeanCar;  delete europeanBike;  delete americanFactory;  delete europeanFactory;  return 0;  
}

结果:

SportsCar
MountainBike
Sedan
RoadBike

3、区别

(1)产品类数量:

        简单工厂模式:通常只有一个抽象产品类,可以派生出多个具体产品类。

        抽象工厂模式:有多个抽象产品类,每个抽象产品类都可以派生出多个具体产品类。

(2)工厂类功能:

        简单工厂模式:具体工厂类只能创建一个具体产品类的实例。

        抽象工厂模式:每个具体工厂类可以创建多个具体产品类的实例,即一个工厂可以创建属于同一产品族但不同等级结构的产品。

(3)接口数量:

        简单工厂模式:通常只使用一个接口,用于定义产品的公共方法。

        抽象工厂模式:可以使用无限个接口,每个接口对应一个抽象产品类,定义不同产品族的公共方法。

(4)创建对象方式:

        简单工厂模式:通过传入参数或配置文件来动态决定创建哪个具体产品类的实例。

        抽象工厂模式:无需指定产品的具体类,访问类可以通过抽象工厂接口获取同族的不同等级的产品。

(5)使用场景:

        简单工厂模式:适用于创建同种产品类型的复杂参数对象,尤其是当对象的创建过程很复杂,需要很多参数且大部分参数固定时。

        抽象工厂模式:适用于系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品的情况。它可以在类的内部对产品族中相关联的多等级产品共同管理。

(6)优缺点:

        简单工厂模式:优点:轻量级,代码结构简单清晰,工厂类可以生产不同的产品。缺点:系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,可能造成工厂逻辑过于复杂,违背了“开放-封闭”原则。

        抽象工厂模式:优点:可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。缺点:需要增加额外的抽象类和接口,增加了系统的复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/850004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深拷贝、浅拷贝、引用拷贝

深拷贝和浅拷贝的区别 1. 引用拷贝2. 对象拷贝 1. 引用拷贝 两个对象指向同一个地址值。 创建一个指向对象的引用变量的拷贝Teacher teacher new Teacher("Taylor",26); Teacher otherteacher teacher; System.out.println(teacher); System.out.println(otherte…

cocos入门8:向量叉乘

在cocos creator中&#xff0c;向量叉乘&#xff08;Cross Product&#xff09;是一个重要的概念&#xff0c;主要用于3D图形学中的方向计算和法线计算。叉乘的结果是一个垂直于两个输入向量的新向量&#xff0c;其长度等于输入向量围成的平行四边形的面积。以下是对向量叉乘的…

前端多人项目开发中,如何保证CSS样式不冲突?

在前端项目开发中&#xff0c;例如突然来了一个大项目&#xff0c;很可能就需要多人一起开发&#xff0c;领导说了&#xff0c;要快&#xff0c;要快&#xff0c;要快&#xff0c;你们给我快。然后下面大伙就一拥而上&#xff0c;干着干着发现&#xff0c;一更新代码&#xff0…

【AI论文与新生技术】Follow-Your-Emoji:精细可控且富有表现力的自由式人像动画技术

我们提出了 Follow-Your-Emoji&#xff0c;这是一种基于扩散的肖像动画框架&#xff0c;它使用目标地标序列对参考肖像进行动画处理。肖像动画的主要挑战是保留参考肖像的身份并将目标表情转移到该肖像&#xff0c;同时保持时间一致性和保真度。为了应对这些挑战&#xff0c;Fo…

JFinal学习07 控制器——接收数据之getBean()和getModel()

JFinal学习07 控制器——接收数据之getBean()和getModel() 视频来源https://www.bilibili.com/video/BV1Bt411H7J9/?spm_id_from333.337.search-card.all.click 文章目录 JFinal学习07 控制器——接收数据之getBean()和getModel()一、接收数据的类型二、getBean()和getModel()…

GDPU JavaWeb Ajax请求

异步请求可以提升用户体验并优化页面性能。 ajax登录 实现ajax异步登录。 注意&#xff0c;ajax用到了jQuery库&#xff0c;先下载好相应的js库&#xff0c;然后复制导入到工程的web目录下&#xff0c;最好与你的前端页面同一层级。然后编写时路径一定要找准&#xff0c;“pag…

WinRAR安装教程

WinRAR安装教程 1. 下载WinRAR 访问官方网站&#xff1a;打开浏览器&#xff0c;访问WinRAR的官方网站&#xff08;如&#xff1a;www.winrar.com.cn&#xff09;。选择版本&#xff1a;根据您的操作系统&#xff08;32位或64位&#xff09;选择合适的WinRAR版本。下载软件&a…

转让北京公司带旅行许可证流程和要求

旅行社是开展旅游服务业务的专项经济主体&#xff0c;旅行社开展相关业务必须持有旅行社业务经营许可证。该资质又分为国内旅行社经营许可证和出境旅行社经营许可证。主要区别在于能否开展出境旅游业务&#xff0c;下面老耿带大家了解&#xff0c;新成立国内旅行社要求及出境旅…

python-windows10普通笔记本跑bert mrpc数据样例0.1.001

python-windows10普通笔记本跑bert mrpc数据样例0.1.000 背景参考章节获取数据下载bert模型下载bert代码windows10的cpu执行结果注意事项TODOLIST背景 看了介绍说可以在gpu或者tpu上去微调,当前没环境,所以先在windows10上跑一跑,看是否能顺利进行,目标就是训练的过程中没…

【Vue2/3】使用Provide/Inject 依赖注入跨组件通信

历史小剧场 什么东西&#xff0c;都有使用年限&#xff0c;比如大米、王朝。 不同的是&#xff0c;大米的年限看得见&#xff0c;王朝的年限看不见。看不见&#xff0c;却依然存在。对于气数&#xff0c;崇祯是不信的&#xff0c;开始不信。等到崇祯十四年&#xff0c;怕什么来…

js--hasOwnProperty()讲解与使用

@TOC 前言 hasOwnProperty(propertyName)方法 是用来检测属性是否为对象的自有属性 object.hasOwnProperty(propertyName) // true/false 讲解 hasOwnProperty() 方法是 Object 的原型方法(也称实例方法),它定义在 Object.prototype 对象之上,所有 Object 的实例对象都会继…

6.7 输入输出流

输入&#xff1a;将数据放到程序&#xff08;内存&#xff09;中 输出&#xff1a;将数据从程序&#xff08;内存&#xff09;放到设备中 C的输入输出分为3种形式&#xff1a; 从键盘屏幕中输入输出&#xff0c;称为标准IO 对于磁盘进行标准输入输出&#xff0c;称为文件IO…

go 读取json文件内容,并且解析内容到interface、 map、 struct

1&#xff0c;解析到interface、 map func ReadAllFileContent(fileName string) {file, err : os.Open(fileName)if err ! nil {log.Fatal(err)}defer file.Close()// buf : make([]byte, 2024)data, err : ioutil.ReadAll(file) //读取的结果是[]byte类型if err ! nil {log.…

第5章 if语句

第5章 if语句 5.1 示例5.2 条件测试5.2.1 检查是否相等5.2.2 检查是否相等时忽略大小写5.2.3 检查是否不相等5.2.4 数值比较5.2.5 检查多个条件5.2.6 检查特定值是否包含在列表中5.2.7 检查特定值是否不包含在列表中5.2.8 布尔表达式 5.3 if 语句5.3.1 简单的if 语句5.3.2 if-e…

硕思闪客精灵(shankejingling)软件最新版下载及详细安装教程

闪客精灵&#xff08;Sothink SWF Decompiler&#xff09;是一款先进的SWF反编译软件&#xff0c;它不但能捕捉、反编译、查看和提取Shock Wave Flash影片&#xff08;.swf和.exe格式文件&#xff09;&#xff0c;而且可以将SWF格式文件转化为FLA格式文件。它能反编译Flash的所…

四天工作制,比你想象的更近了一点

原文&#xff1a;Andrew Keshner - 2024.05.30 软件公司、大型企业甚至警察部门都在试验这一看似遥不可及的概念。 教育软件公司 Kuali 的会议精简&#xff0c;除非绝对必要&#xff0c;员工尽量避免安排会议。即使有会议&#xff0c;也鼓励员工跳过与自己工作无关的部分。在…

随机函数rand

使用步骤: 包含库 cstdlib #include <cstdlib>使用时间当做随机数种子 srand(time(NULL));调用rand来返回随机数 std::cout<<RAND_MAX<<std::endl; std::cout<<rand()<<std::endl;rand只能生成 范围通常是 0 到 RAND_MAX 之间。 代码示例 …

从技术到产品:以客户为中心的产品研发之路

一、引言 在快速发展的商业环境中&#xff0c;产品作为连接企业与市场的桥梁&#xff0c;其重要性不言而喻。从摸着石头过河搞产品&#xff0c;到广泛传播NPDP&#xff08;新产品开发流程&#xff09;理念&#xff0c;产品研发的道路经历了从直觉驱动到系统思维的转变。本文将…

ArcGIS for js 4.x 加载图层

二维&#xff1a; 1、创建vue项目 npm create vitelatest 2、安装ArcGIS JS API依赖包 npm install arcgis/core 3、引入ArcGIS API for JavaScript模块 <script setup> import "arcgis/core/assets/esri/themes/light/main.css"; import Map from arcgis…

Linux创建虚拟环境

Linux创建虚拟环境 linux安装虚拟环境和Windows大体相似 1.安装virtualenv pip3 install virtualenv2.创建虚拟环境 创建文件夹用于保存项目虚拟环境 mkdir /envs创建环境 virtualenv /envs/django_-shop-system --pythonpython3.83.激活虚拟环境 source /envs/django_-sho…