12,【设计模式】工厂
设计模式工厂
- 通过工程来构建任意参数对象
- &&
- std::forward
- std::move
在C++中,“工厂”(Factory)是一种设计模式,它提供了一种创建对象的方式,将对象的创建和使用代码分离开来,提高了代码的可扩展性和可维护性。
工厂模式通过一个共同的接口或基类来定义产品对象的创建方法,而具体的对象创建过程则由子类或具体工厂来实现。通过使用工厂模式,我们可以隐藏对象的创建细节,使客户端代码只关心使用对象而不必关心对象的创建方式。
工厂模式常见的几种变体包括:
-
简单工厂模式(Simple Factory):由一个工厂类负责创建所有的产品对象,根据不同的传入参数返回不同的产品实例。
-
工厂方法模式(Factory Method):通过定义一个创建对象的接口,让子类决定实例化哪个类。每个具体子类都对应一个具体产品。
-
抽象工厂模式(Abstract Factory):提供一个创建相关或依赖对象族的接口,而无需指定具体类。不同的具体工厂类可以创建不同类别的产品对象。
工厂模式在实际开发中常用于:
- 封装对象的具体创建过程,隐藏对象的实现细节;
- 实现创建对象的灵活性,方便根据需求变化创建不同的对象;
- 遵循开闭原则,提高代码的可扩展性和可维护性。
需要注意的是,工厂模式并不是万能的,适用于需要创建复杂对象、对象创建过程涉及多个步骤或对象创建涉及多个类的情况。对于简单的对象创建,直接使用构造函数就足够了。
通过工程来构建任意参数对象
advanced.h
#pragma once
#include <iostream>
#include <type_traits>
using namespace std;
//定义
template<int ...>//定义一个接受任意数量整数参数的模板函数
struct HelloIndex
{};//通过using展开的中间值
template<int N, int ...ParamTypes>
struct SpawnIndex
{using Type = typename SpawnIndex<N - 1, N - 1, ParamTypes...>::Type;//typename 来明确告诉编译器该名称是类型而不是值
};//循环终止
template<int ... ParamTypes>
struct SpawnIndex<0, ParamTypes ...>
{typedef HelloIndex<ParamTypes...>Type;
};//工厂
template<class T>
T* CreateObject()//创建一个无参的T对象的工厂函数
{return new T();
}template<class T, class Arg0>
T* CreateObject()//创建一个带一个参数的T对象的工厂函数
{return new T(Arg0);
}template<class T,class Arg1,class Arg2>
T* CreateObject()
{return new T(Arg1, Arg2);
}//改变为可变参数可以大大节省了代码量(和上面相比)
template<class T, class ...ParamTypes>
T* CreateObject(ParamTypes &&...Param)//创建一个可变参数的T对象的工厂函数,可以接受任意数量的参数
{//return new T(Param...);//会产生一个拷贝,下面代码不会产生拷贝return new T(std::forward<ParamTypes>(Param)...);//使用std::forward将参数引用传递给T对象的构造函数,并返回创建的对象的指针//这样可以避免产生不必要的拷贝
}
学习.cpp
#include <iostream>
#include"advanced.h"struct FTestA
{};struct FTestB
{FTestB(int a, int b){}
};int main()
{SpawnIndex<10>::Type* Hello = CreateObject<SpawnIndex<10>::Type>();//using Hello = CreateObject<SpawnIndex<10>::Type>();if (Hello){}FTestA* p = CreateObject<FTestA>();FTestB* p2 = CreateObject<FTestB>(1,2);return 0;
}
&&
折叠
可以看作是引用的引用
&& 表示右值引用(rvalue reference)。它是C++11引入的一种新的引用类型,用于支持移动语义和完美转发
在C++17中,引入了参数包展开的语法,使得对模板参数包(parameter pack)的操作更加便捷和灵活。其中,参数包展开支持对右值引用的折叠(rvalue reference collapsing),即将多个右值引用折叠为一个右值引用
std::forward
https://www.cnblogs.com/oniisan/p/moveFunction.html
用在泛型代码中进行完美转发
完美转换,传入左值,把左值引用传递,传入右值,把右值引用传递,通过此方式避免拷贝
头文件:
#include <type_traits>
std::move
左值或右值都转换为右值引用
头文件:
#include <type_traits>
相关文章:
12,【设计模式】工厂
设计模式工厂 通过工程来构建任意参数对象&&std::forwardstd::move 在C中,“工厂”(Factory)是一种设计模式,它提供了一种创建对象的方式,将对象的创建和使用代码分离开来,提高了代码的可扩展性和可…...
mysql 8.0 窗口函数 之 分布函数 与 sql server (2017以后支持) 分布函数 一样
mysql 分布函数 percent_rank() :等级值 百分比cume_dist() :累积分布值 percent_rank() 计算方式 (rank-1)/(rows-1), 其中 rank 的值为使用RANK()函数产生的序号,rows 的值为当前…...
Python Opencv实践 - 图像直方图自适应均衡化
import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/cat.jpg", cv.IMREAD_GRAYSCALE) print(img.shape)#整幅图像做普通的直方图均衡化 img_hist_equalized cv.equalizeHist(img)#图像直方图自适应均衡化 #1. 创…...
Linux编程:在程序中异步的调用其他程序
Linux编程:execv在程序中同步调用其他程序_风静如云的博客-CSDN博客 介绍了同步的调用其他程序的方法。 有的时候我们需要异步的调用其他程序,也就是不用等待其他程序的执行结果,尤其是如果其他程序是作为守护进程运行的,也无法等待其运行的结果。 //ssss程序 #include …...
04有监督算法——支持向量机
1.支持向量机 1.1 定义 支持向量机( Support Vector Machine )要解决的问题 什么样的法策边界才是最好的呢? 特征数据本身如果就很难分,怎么办呢? 计算复杂度怎么样?能实际应用吗? 支持向量机( Support Vector Machine , SVM)是一类按监督学习( s…...
macos 使用vscode 开发python 爬虫(安装一)
使用VS Code进行Python爬虫开发是一种常见的选择,下面是一些步骤和建议: 安装VS Code:首先,确保你已经在你的macOS上安装了VS Code。你可以从官方网站(https://code.visualstudio.com/)下载并安装最新版本…...
专有网络VPC私网/公网类产品选择
私网类产品选择 VPC互连:云企业网,对等连接 VPC与本地IDC互连:VPN网关,高速通道,云企业网,智能接入网关 VPC与多站点连接:VPN网关,智能接入网关,VPN网关高速通道 远程接…...
Connect-The-Dots靶场
靶场下载 https://www.vulnhub.com/entry/connect-the-dots-1,384/ 一、信息收集 探测存活主机 netdiscover -r 192.168.16.161/24nmap -sP 192.168.16.161/24端口操作系统扫描 nmap -sV -sC -A -p 1-65535 192.168.16.159扫描发现开放端口有 21 ftp 80 http 20…...
Linux解决RocketMQ中NameServer启动问题
启动步骤可以查看官网,https://github.com/apache/rocketmq 一下说明遇到的问题。 1:ROCKETMQ_HOME问题 根据官网提示进入mq/bin目录下,可以使用./mqnamesrv进行NameServer启动,但是会遇到第一个问题,首次下载Rocket…...
js逆向实战之某书protobuf反序列化
什么是Protobuf? \qquad Protobuf(Protocol Buffer)是 Google 开发的一套数据存储传输协议,作用就是将数据进行序列化后再传输,Protobuf 编码是二进制的,它不是可读的,也不容易手动修改…...
cpolar+JuiceSSH实现手机端远程连接Linux服务器
文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …...
[MyBatis系列②]Dao层开发的两种方式
目录 1、传统开发 1.1、代码 1.2、存在的问题 2、代理开发 2.1、开发规范 2.2、代码 ⭐mybatis系列①:增删改查 1、传统开发 传统的mybatis开发中,是在数据访问层实现相应的接口,在实现类中用"命名空间.id"的形式找到对应的映…...
言语理解-中心理解之主题词及行文脉络
例题 例题 例题 例题 例题 例题...
LeetCode 面试题 01.05. 一次编辑
文章目录 一、题目二、C# 题解法一:从第一个不同位置处判断后续相同子串法二:前后序遍历判断第一个不同字符的位置关系 优化法一法二 一、题目 字符串有三种编辑操作:插入一个英文字符、删除一个英文字符或者替换一个英文字符。 给定两个字符串ÿ…...
Mybatis查询in的字段过多不走索引
mybatis查询in的字段有索引,比如说是主键查询, 但是in的字段过多导致索引失效, 这个时候可以考虑将in的数量变少, 200以内都可以, 在数据库方面采用 foreach unionall 的方式将数据集合查询出来 Service层: List<…...
封装公共el-form表单(记录)
1.公共表单组件 //commonForm.vue <script> import {TEXT,SELECT,PASSWORD,TEXTAREA,RADIO,DATE_PICKER } from /conf/uiTypes import { deepClone } from /utils export default {name: GFormCreator,props: {config: { // title/itemstype: Object,required: true}}…...
List 分批处理
1.Google Guava <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version></dependency>List<String> tempList Arrays.asList("水星","金星&qu…...
SpringSession
Spring Session 是 Spring 的项目之一。Spring Session 提供了一套创建和管理 Servlet HttpSession 的方案,默认采用外置的 Redis 来存储 Session 数据,以此来解决 Session 共享的 问题。(springsession储存session数据的方式有很多,我们常…...
Python Web 开发之 JWT 简介
在之前的课程中,介绍过 Flask-Login 框架,它是基于 Session 和 Cookie 技术来实现用户授权和验证的,不过 Session 有很多的局限性,这一节介绍一种基于 token 的验证方式 —— JWT (JSON Web Token),除了对 JWT 的概念讲解之外&…...
科技资讯|荷兰电动自行车丢失将被拒保,苹果Find My可以减少丢失
荷兰最大的自行车协会荷兰皇家旅游俱乐部宣布,将不再为胖胎电动自行车提供保险,因为这种自行车的被盗风险极高。 随着电动自行车的销量飙升,胖胎也变得更受欢迎。但问题是,胖胎电动自行车也成为了自行车盗窃者的首选目标。ANWB …...
Taskbar11完全指南:解锁Windows 11任务栏自定义的终极解决方案
Taskbar11完全指南:解锁Windows 11任务栏自定义的终极解决方案 【免费下载链接】Taskbar11 Change the position and size of the Taskbar in Windows 11 项目地址: https://gitcode.com/gh_mirrors/ta/Taskbar11 还在为Windows 11任务栏的严格限制感到困扰吗…...
Rdkit实战:从2D到3D,解锁分子构象生成与优化的全流程
1. 从2D到3D:分子构象生成的基础概念 第一次接触分子构象生成时,我完全被各种术语搞晕了——距离几何、ETKDG、MMFF这些名词听起来就像天书。直到用RDKit实际操作了几次,才发现这个过程其实就像搭积木:先有个平面设计图ÿ…...
【亲测免费】 sapi5.inf下载 - 解决微软语音注册表问题 0x80040154
sapi5.inf下载 - 解决微软语音注册表问题 0x80040154 【下载地址】sapi5.inf下载-解决微软语音注册表问题0x80040154 sapi5.inf下载 - 解决微软语音注册表问题 0x80040154如果你在进行语音应用开发或者配置微软语音引擎时遇到了著名的错误代码0x80040154,这个资源正…...
探索Qt高级停靠系统:打造灵活强大的用户界面
探索Qt高级停靠系统:打造灵活强大的用户界面 【下载地址】Qt-Advanced-Docking-System使用教程与示例代码 Qt-Advanced-Docking-System 使用教程与示例代码本仓库提供了一个关于如何使用 Qt-Advanced-Docking-System 的详细教程及示例代码 项目地址: https://gitc…...
零基础极速上手教程:用AI建站工具10分钟生成你的第一个网站
你是不是也想过拥有一个属于自己的网站,但总觉得那是程序员才干得了的事?或者你曾经试过一些建站工具,结果被复杂的后台、密密麻麻的选项和所谓的「可视化拖拽」搞得晕头转向?别担心,今天这篇教程,就是专门…...
Win11触控板误触太烦人?三招精准关闭方案,总有一款适合你
1. 系统设置:最快捷的触控板关闭方案 刚换Win11那会儿,我总在打字时不小心碰到触控板,光标突然跳转导致输入错位。后来发现系统设置里藏着个"一键关闭"开关,实测下来这招最适合临时需要禁用触控板的场景。具体操作路径&…...
国网智能电表解决方案:从HPLC通信到远程费控的架构与实战
1. 项目概述:从一块电表到一套能源数据中枢如果你家里最近换了新电表,或者从事与园区、工厂能源管理相关的工作,大概率会接触到一种外观更简洁、带液晶屏、还能远程抄表的智能电表。这背后,就是国网电能表解决方案的落地体现。它早…...
慕尼黑电子展深度攻略:从技术侦察到资源对接的实战指南
1. 展会项目概述与核心价值解析又到了一年一度的行业盛会密集期,对于身处电子、嵌入式、物联网这些硬科技赛道的从业者来说,参加一场高质量的线下展会,其价值远不止是“逛一逛”那么简单。它更像是一次集中的行业体检、一次高效的技术社交和一…...
告别虚拟机卡顿:在VMware 17上为RHEL 9.2分配CPU和内存的黄金法则
告别虚拟机卡顿:在VMware 17上为RHEL 9.2分配CPU和内存的黄金法则 当你在VMware Workstation 17上运行RHEL 9.2时,是否经常遇到编译速度慢、桌面响应延迟甚至整个系统卡死的情况?这很可能是因为你没有根据宿主机的实际硬件情况科学分配虚拟资…...
强烈的“似曾相识“感:由于人类左右大脑处理信息的速度并非完全同步,在某些特殊瞬间,这个流程会被打乱
海马效应(既视现象) 目录 海马效应(既视现象) 核心科学原理 高发场景与人群 典型例子 海马效应,科学上称为既视现象(Dj vu),是指人在从未真实经历过的当下场景中,突然产生强烈的"似曾相识"感,误以为眼前的一切曾经发生过的认知错觉。它并非玄学中的"…...
