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

工厂模式是一种创建型设计模式,通过封装对象的创建过程,提高代码的可维护性、可扩展性,并实现对象的创建与使用的解耦。

简单工厂模式: 提供一个工厂类,根据传入的参数来决定创建哪种产品类的实例。这种模式不符合开闭原则,因为每次添加新产品类型都需要修改工厂类。

class products {
public:int money = 0;virtual void sell() = 0;
};
class apple :public products {
public:void sell() {money += 10;}
};
class banana :public products {
public:void sell() {money += 20;}
};
class factory {
public:static products* get_product(int d) {switch (d) {case 0:return new apple;case 1:return new banana;}return nullptr;}
};

工厂方法模式:定义一个创建产品的接口,由子类决定实例化哪个产品类。每个具体工厂类对应一个具体产品类,符合开闭原则,但客户端需要知道具体工厂类。

class products {
public:virtual void sell() = 0;
};class factory {
public:virtual products* get_product() = 0;
};class apple :public products{
public:void sell(){std::cout << "apple" << std::endl;}
};class banana :public products {
public:void sell() {std::cout << "banana" << std::endl;}
};class apple_producter:public factory  {
public:products* get_product() {return new apple;}
};class banana_producter:public factory {
public:products* get_product() {return new banana;}
};

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通过工厂接口创建一族产品,有多个具体工厂类对应不同的产品族,符合开闭原则且客户端无需知道具体工厂和产品类。

class products {
public:virtual void show() = 0;
};
//抽象产品族
class fruit :public products {};class apple :public fruit {
public:void show() {std::cout << "apple" << std::endl;}
};class banana :public fruit {
public:void show() {std::cout << "banana" << std::endl;}
};
//抽象产品族
class vegetable :public products {};class potato :public vegetable {
public:void show() {std::cout << "potato" << std::endl;}
};class tomato :public vegetable {
public:void show() {std::cout << "tomato" << std::endl;}
};class factory {
public:virtual fruit* get_fruit() = 0;virtual vegetable* get_vegetable() = 0;
};class farm1:public factory {
public:fruit* get_fruit() {return new apple;}vegetable* get_vegetable() {return new potato;}
};class farm2:public factory {
public:fruit* get_fruit() {return new banana;}vegetable* get_vegetable() {return new tomato;}
};

工厂模式的优点

  • 封装和隐藏实现细节: 工厂模式将对象的创建过程封装在一个独立的类或方法中,使得客户端代码无需了解对象的具体实现细节。这种封装提高了代码的抽象性,隐藏了实现细节,使系统更加模块化,降低了耦合度。

  • 易于扩展: 工厂模式使得系统更容易扩展,当需要添加新的对象类型时,只需修改工厂类或方法而不需要修改客户端代码。这有利于遵循开闭原则,即对扩展开放,对修改关闭。

  • 单一职责原则: 工厂模式有助于遵循单一职责原则,即一个类应该只有一个原因引起变化。工厂负责对象的创建,客户端负责对象的使用,这样各自的职责清晰明确,使得代码更易于理解和维护。

  • 代码复用: 工厂模式促进了代码的重用。对象的创建逻辑被集中在一个地方,可以在多个地方共享相同的创建逻辑,避免了重复的代码。

  • 依赖注入: 工厂模式使得依赖注入更容易实现。通过将对象的创建交给工厂,可以更方便地在需要时注入不同实现的对象,而无需直接修改客户端代码。

  • 抽象层的引入: 工厂模式引入了一个抽象层,客户端通过这个抽象层与具体的对象实现解耦。这种解耦提高了代码的灵活性,使得客户端更容易适应变化。

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

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

相关文章

从零开始学HCIA之WLAN基础02

1、CAPWAP是无线接入点的控制与配置协议&#xff0c;用以支持大规模WLAN组网&#xff0c;同时实现多厂商AC和AP间互通。 2、CAPWAP协议主要功能包括&#xff1a; &#xff08;1&#xff09;实现 AP对 AC的自动发现及 AP和 AC的状态机运行与维护&#xff1b; &#xff08;2&a…

【JS运算符/表达式】`?.` `??` `...` `,` `=` `||=` `?:`等运算符讲解

运算符&#xff1a;除了以下demo代码的内容&#xff0c;其他不常用的就不写了 // 常用运算符&#xff1a; // 最常用的 - * / > < > < && || 就不说了// 取余 % console.log(10 % 3); // 1// 加法赋值运算符 // let a 1; // console.log((a 10)); //…

力扣--动态规划1027.最长等差数列

思路分析&#xff1a; 使用动态规划的思想&#xff0c;定义二维数组dp&#xff0c;其中dp[i][j]表示以nums[i]为结尾&#xff0c;公差为(j-1000)的等差数列长度。为了适应负数的情况&#xff0c;将公差的范围设为[-1000, 1000]&#xff0c;并且加上1000作为数组索引。 初始化r…

Sentinel 注解支持

一、注解支持 Sentinel 提供了 SentinelResource 注解用于定义资源&#xff0c;并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException 等。使用 Sentinel Annotation AspectJ Extension 的时候需要引入以下依赖&#xff1a; <dependency><groupId>com.…

11:日志分析系统ELK|Elasticsearch|kibana

日志分析系统ELK&#xff5c;Elasticsearch&#xff5c;kibana 日志分析系统ELKELK概述Elasticsearch安装Elasticsearch部署Elasticsearch集群Elasticsearch插件 熟悉Elasticsearch的API调用_cat API创建 tedu 索引使用 PUT 方式增加数据查询数据修改数据删除数据 KibanaKibana…

锂电池SOC估计 | PyTorch实现基于Basisformer模型的锂电池SOC估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 PyTorch实现基于Basisformer模型的锂电池SOC估计 锂电池SOC估计&#xff0c;全新【Basisformer】时间序列预测 1.采用自适应监督自监督对比学习方法学习时序特征&#xff1b; 2.通过双向交叉注意力机制计算历史序列和…

BL、万科、中海地产、碧桂园、华润置地、佳兆业、金地商置、龙湖、绿城、融创、时代中国、旭辉、中国建筑校招笔试题

为了帮助应聘者更好地备战地产公司的招聘考试&#xff0c;我将介绍以下13套校招试题资料&#xff0c;涵盖了24 BL、24万科、24中海地产、碧桂园、华润置地、佳兆业、金地商置、龙湖、绿城、融创、时代中国、旭辉和中国建筑等知名房地产企业&#xff0c;为您提供全方位的备考资源…

提高移动应用的安全性:策略与实践

提高移动应用的安全性&#xff1a;策略与实践 随着移动应用的普及&#xff0c;安全性问题变得日益重要。用户数据保护、应用逻辑安全、以及防止恶意攻击都是开发者必须关注的重点。本文将探讨如何通过一系列策略和实践来提高移动应用的安全性。 1. 数据加密与保护 敏感数据加…

【CMake】(10) 变量操作

追加 追加操作允许你将新元素添加到现有的变量或列表中。 使用 set 进行变量追加 set 命令不仅可以用于定义变量,还可以用于修改变量的值,包括追加新值。下面是 set 命令用于追加操作的示例: cmake_minimum_required(VERSION 3.0) project(TEST)set(VAR "Hello&quo…

2024年环境安全科学、材料工程与制造国际学术会议(ESSMEM2024)

【EI检索】2024年环境安全科学、材料工程与制造国际学术会议&#xff08;ESSMEM2024) 会议简介 我们很高兴邀请您参加将在三亚举行的2024年环境安全科学、材料工程和制造国际学术会议&#xff08;ESSMEM 2024&#xff09;。 ESSMEM2024将汇集世界各国和地区的研究人员&…

BST基本性质,LeetCode 235. 二叉搜索树的最近公共祖先

一、题目 1、题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08…

李宏毅2023机器学习作业1--homework1——数据集操作

一、下载数据 下载训练数据covid.train.csv 测试数据covid.test.csv !wget -O covid_train.csv https://www.dropbox.com/s/lmy1riadzoy0ahw/covid.train.csv?dl0 !wget -O covid_test.csv https://www.dropbox.com/s/zalbw42lu4nmhr2/covid.test.csv?dl0 二、划分训练集和…

【Spring Boot 3】【JPA】@OneToMany 实现一对多单向关联

【Spring Boot 3】【JPA】@OneToMany 实现一对多单向关联 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学…

初识Lombok

前言 最近读一些公司的业务代码&#xff0c;发现近几年的java项目工程中都使用了lombok&#xff0c;lombok是一个可以自动生成get,set、toString等模板类方法的工具框架&#xff0c;程序再引入lombok后&#xff0c;添加一个注解便可以不写get\set\toString等方法。 Lombok示例…

计算机组成原理(15)----输入/输出系统

目录 一.I/O系统的基本概念 &#xff08;1&#xff09;I/O硬件 &#xff08;2&#xff09;I/O控制方式 1.程序查询方式 2.程序中断方式 3.DMA&#xff08;Direct Memory Access&#xff09;控制方式 4.通道控制方式 &#xff08;3&#xff09;I/O软件 1.I/O指令 2.通…

全志H713/H618方案:调焦电机(相励磁法步进电机)的驱动原理、适配方法

一、篇头 全志H713平台&#xff0c;作为FHD投影的低成本入门方案&#xff0c;其公板上也配齐了许多投影使用的模组&#xff0c;本文即介绍投影仪调焦所用的步进电机&#xff0c;此模组的驱动原理、配制方法、调试方法。因为条件限制&#xff0c;本文采用的是H618香橙派Z3平台&…

面试题vue

目录 vue的响应式原理 路由跳转与拦截 vue2和vue3的生命周期 watch和computed的区别 vue的响应式原理 数据变更&#xff0c;视图自动更新 使用Object.defineProperty()方法来监听属性的变化&#xff0c;实现双向数据绑定。Object.defineProperty()方法可以控制对象的属性访…

Linux-进程-007

1进程 1.1进程基本概念 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程&#xff0c;包括进程的创建&#xff0c;进程的调度&#xff0c;进程的消亡1.2进程相关命令 1.2.1打开任务管理器 【top】&#xff1a;动态查看当前系统…

国企招聘考试------笔试资料-校园招聘

国企招聘考试一直备受广大求职者的关注&#xff0c;因为国企招聘通常具有稳定的岗位、优厚的福利待遇和广阔的发展空间&#xff0c;因此备战国企招聘考试成为许多求职者的重要任务。为了帮助求职者更好地准备国企招聘笔试&#xff0c;我将为你介绍这套校招试题资料。 国企招聘…

Win UI3开发笔记(四)设置主题

Win UI3设置主题过程 参考文章网址&#xff1a;https://blog.csdn.net/white_night_SZTU/article/details/132819719 核心代码&#xff1a; rootElement.RequestedTheme ElementTheme.Dark; //这和在前端设置控件的 RequestedTheme"Dark"属性是一样的结果&#xf…