C++设计模式之模板工厂模式

C++教程(二):C++设计模式之工厂模式详细解析以及工厂模板类实现 在 C++ 中,工厂模式(Factory Pattern) 是一种创建型设计模式,它通过定义一个接口来创建对象,而不是直接实例化具体的类。这种模式的主要目的是将对象的创建过程封装起来,以便在不修改客户端代码的情况下轻松扩展新类型的对象。 阅读详情
  • 工厂模式一般分为简单工厂模式,工厂方法模式,抽象工厂模式,不过今天我介绍的是由模板实现的工厂模式,可以实现产品类自动注册到对应的工厂类,完全解耦,并且提供工厂单例访问。
  • fantory.h
#pragma once

#include <map>
#include <string>

//产品工具抽象类
template<class AbstractProduct>
class AbstractProductTool
{
public:
	virtual AbstractProduct* creatProduct() = 0;
protected:
	AbstractProductTool(){}
	~AbstractProductTool(){}
};

//工厂模板类
template<class AbstractProduct>
class ProductFactory
{
public:
	static ProductFactory<AbstractProduct> &instance() {
		static ProductFactory<AbstractProduct> factory;
		return factory;
	}

	void registerProduct(const std::string &name, AbstractProductTool<AbstractProduct>* adsProductTool) {
		m_registerProductMap[name] = adsProductTool;
	}

	AbstractProduct* createProduct(const std::string &name) {
		if (m_registerProductMap.find(name) != m_registerProductMap.end())
			return m_registerProductMap[name]->creatProduct();
		else
			return nullptr;
	}

private:
	ProductFactory(){}
	ProductFactory(const ProductFactory&){}
	ProductFactory& operator=(const ProductFactory&){}

	std::map<std::string, AbstractProductTool<AbstractProduct>* > m_registerProductMap;
};

//具体产品工具类
template<class AbstractProduct, class ConcreteProduct>
class ConcreteProductTool :public AbstractProductTool<AbstractProduct>
{
public:
	explicit ConcreteProductTool(const std::string& name) {
		ProductFactory<AbstractProduct>::instance().registerProduct(name, this);
	}

	AbstractProduct* creatProduct() override {
		return new ConcreteProduct();
	}
};

//利用全局静态变量的初始化特性实现产品类的自注册
#define RegisterProduct(AbstractProduct, ConcreteProduct) \
	static ConcreteProductTool<AbstractProduct, ConcreteProduct> register##ConcreteProduct(#ConcreteProduct);

  • factory.cpp
#include "factory.h"
#include <iostream>

class Shoes
{
public:
	virtual void show() = 0;
};

class Nike :public Shoes
{
public:
	void show() override {
		std::cout << "nike shoes" << std::endl;
	}
};
//注册Nike到Shoes的工厂类中
RegisterProduct(Shoes, Nike)

class Adidas : public Shoes
{
public:
	void show() override{
		std::cout << "adidas shoes" << std::endl;
	}
};
//注册Adidas到Shoes的工厂类中
RegisterProduct(Shoes, Adidas)


class Clothe
{
public:
	virtual void display() = 0;
};

class Shirt :public Clothe
{
public:
	void display() override {
		std::cout << "Shit" << std::endl;
	}
};
//注册Shirt类到Clothe的工厂类中
RegisterProduct(Clothe, Shirt)

class Dress :public Clothe
{
public:
	void display() override {
		std::cout << "Dress" << std::endl;
	}
};
//注册Dress类到Clothe的工厂类中
RegisterProduct(Clothe, Dress)


void factorytest()
{
	Shoes *shoe1 = ProductFactory<Shoes>::instance().createProduct("Nike");
	Shoes *shoe2 = ProductFactory<Shoes>::instance().createProduct("Adidas");

	shoe1->show();
	shoe2->show();

	Clothe *clothe1 = ProductFactory<Clothe>::instance().createProduct("Shirt");
	Clothe *clothe2 = ProductFactory<Clothe>::instance().createProduct("Dress");
	clothe1->display();
	clothe2->display();

	delete shoe1;
	delete shoe2;
}
  • 自己定义好产品基类,写好对应的子类,调用注册宏就可以实现注册对应产品类到对应的工厂类,这也可以屏蔽对应子类的头文件,只要注册了,然后工厂单例知道对应的类名称就可以生产了,完全地解耦,很方便,这里只是提供了一个简单的样例,可以根据对应的业务场景去丰富。
C++模板与设计模式融合:静态多态实现策略、工厂、观察者模式 设计模式是解决软件设计中常见问题的经典方案,而C++模板则提供了强大的编译期泛型编程能力。两者的结合,能够将传统的运行时多态(如虚函数)转变为静态多态,在编译期完成类型绑定和代码生成,从而实现零开销抽象。这种技术价值在于,它能显著提升性能,消除虚函数调用开销,并增强类型安全性,尤其适用于高性能计算、游戏引擎和基础库开发等场景。通过将策略模式、工厂模式和观察者模式等经典模式进行模板化改造,开发者可以在编译期固定算法骨架,利用策略作为模板参数或奇特的递归模板模式(CRTP)实现类型安全的模式变体。本文深入探讨了 阅读详情

相关推荐

【软件安装系列】Ubuntu+mysql5.7.27+Jira8.3.1+邮箱服务器配置+Confluence6.15.7安装经验和采坑总结

文章目录一、软件准备(百度云易被吞,就不放了)1.1 官网下载的新鲜的Jira和Confluence1.2 linux的jdk一份1.3 Jira和Confluence的破解程序或者破解包一份1.4 java的连接器一份二、安装过程1--java环境配置2.1 将下载下来的jdk包解压在/usr/local/java目录中2.2 写入环境变量三、安装过程2--mysql5.7.27环境配置3.1 ...

xiaosha_的博客 6893

基于模板的自动注册工厂模式(C++11实现)

工厂类 factory.h #pragma once #include <functional> #include <memory> #include <unordered_map> template <typename T, typename... Args> class Factory { public: static Factory& Instance() { if (!instance_) { instanc

A_L_A_N 3095

Claude Code vs Codex

Claude Code 提供了一个生产就绪(production-ready)的实现,包含良好的错误处理、优雅的关闭逻辑、详细注释和文档,以及内置测试。Claude Code 输出了一个可运行的 Next.js + TypeScript 前端,但错过了一些设计里的黄色主题元素;Codex 则生成自己的版本,没有导出设计中的图片,也没严格遵照设计主题。Codex 完成同样功能,但更简洁直接,文档和注释少一些但功能达标。任务都用同样的提示,使用 TypeScript 实现,并在一天内完成。

weixin_49869937的博客 2388

c++11工厂子类实现自注册的两种方法

一、产品类构建 1. 猫基类与各品种猫子类 class Cat { public: virtual void Printer() = 0; }; class Persian : public Cat { public: virtual void Printer() {std::cout<<"I am a cat, persian."<<std::endl;} }; class Birman : public Cat { public: virtual vo

昔风不起,唯有努力生存! 3241

vue引入使用腾讯地图

// 引入鹅厂地图 initMap(lat = 0.0000000, lng = 0.0000000) { // 定义地图中心点坐标- var center = new TMap.LatLng(lat, lng) // 定义map变量,调用 TMap.Map() 构造函数创建地图 map = new TMap.Map(document.getElementById('txMapBox'), { center: center, // 设.

LiangRZ 4536

infercnv的实操

摘要: 博主在infercnv分析中遇到执行困难,外包服务不可靠(未按要求使用HMM方法)。通过优化策略(逐样本处理、精简细胞至1000个、固定随机种子)解决了运行问题,但HMM功能仍无法实现。最终参考Cell期刊标准设置阈值完成分析,后续将继续更新进展。该案例凸显了生物信息分析中自主优化的重要性。(150字)

xiaoyusang的博客 308

在C++中自动注册工厂机制一种方案的实现示例

只需要在调用主程序编译后产生的可执行文件时在命令行加上命令行参数即可指定调用对应算法的 Execute() 函数,如假设主程序编译后产生的可执行文件在当前目录下的build文件夹下,且此可执行程序名为 main ,输入。总而言之,本文只是对自动化注册工厂这个流程做了一个简单的示范,实际情况下会更为复杂,比如函数的设定、命令行参数的指定与判断、具体派生类的功能等等可以根据需要自主设定。本文章将仿照OpenFOAM中的 RTS 机制的实现方式,来进行一套类似 RTS 机制的自动注册工厂的实现的简单示例,即。

2301_77373203的博客 2144

【WRF工具】WRF 模型输出可视化工具 plotfmt

【WRF工具】WRF 模型输出可视化工具 plotfmt

WW、forever的博客 1292

C++设计模式-创建型设计模式:工厂模式

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

最不正经的计算机专业学生 509

24、JavaFX MP3 音频播放器开发详解

本文详细介绍了如何使用JavaFX开发一个功能丰富的MP3音频播放器,涵盖文件拖放加载、音频播放控制、音频频谱可视化、进度定位滑块等核心功能,并提供了完整的代码实现和解析。适合希望学习JavaFX多媒体应用开发的开发者参考。

wind6的博客 170

基于ESP32的智能无线广播系统开发博客

通过本项目的开发,我们成功地实现了基于ESP32的智能无线广播系统。该系统不仅具备传统广播的功能,还实现了通过Wi-Fi无线传输音频、实时广播和智能控制等多种先进功能。未来,随着技术的进一步发展,我们还可以扩展更多功能,如智能推荐广播内容、支持语音识别和控制等。希望本项目能够为嵌入式开发人员提供一些思路和参考,帮助大家在实际开发中更好地应用ESP32平台,开发出更加智能和实用的无线广播系统。

2201_76125393的博客 423

c++11实现一个自动注册的工厂模式

设计模式 自动注册的工厂方法

小罗的博客 4411

【VTK】VTK中的光标样式

本文分享VTK中的光标设置相关内容技术,希望对各位小伙伴有所帮助!

qq_40041064的博客 1931

设计模式之 简单工厂模式(C++ 模板实现)

这篇文章在上一篇介绍简单工厂模式的实现基础之上,采用C++模板技术来克服上一篇中提到的缺点。 同样以汽车厂生产汽车为例进行说明。 代码如下: #include #include using namespace std; class CCarBase { public: virtual void printName() { cout << "汽车厂商:" <<

decode 1398

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C/C++实现工厂模板设计模式(Factory Pattern)

/ 产品基类public:// 具体产品Apublic:// 具体产品Bpublic:// 工厂类public:// 创建产品的方法# include <iostream> # include <memory> // 产品基类 class Product {public :// 具体产品A class ProductA : public Product {public :} };

weixin_42849849的博客 546

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案,使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式坚持七大原则:开闭原则,单一职责原则,里氏替换原则,依赖倒转原则,接口隔离原则,迪米特原则,合成复用原则,而各项设计模式又区分为三大模式,创建型模式,结构型模式,行为模式。

weixin_45068267的博客 2457

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板

简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板。

夜悊的博客 678

设计模式C++ (一)

简单工厂模式 #include<iostream> #include<string> using namespace std; enum type{EWATER,ECREAM}; class SkinProduct{ public: virtual void createProduct()=0; }; class Water:public SkinProduct{ public: void createProduct(){ cout<&l

qq_39512601的博客 1125

【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程

本文的目的是深入探讨C++元模板(C++ Metatemplates)和设计模式(Design Patterns)的结合,以及设计模式在模板编程中的应用。预期的读者是具有一定C++编程基础,对元模板和设计模式有一定了解,并希望进一步提升这两方面技能的开发者。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 637

C++类模板:从通用容器到可变参数工厂的设计模式解析

泛型编程是现代C++的核心范式之一,其核心思想是通过参数化类型实现代码复用。类模板作为泛型编程的基础设施,本质上是一种编译期代码生成模式——编译器根据模板蓝图和具体类型参数自动生成类型安全的特化类。这一机制不仅解决了传统C语言中void*带来的类型安全问题,还通过编译期多态实现了零开销抽象。在工程实践中,类模板广泛应用于标准库容器(如vector、map)、智能指针(unique_ptr、shared_ptr)等基础组件,大幅提升了代码的复用性和可维护性。随着C++标准演进,可变参数模板的引入进一步扩展了这

weixin_30387423的博客 425

c++常用设计模式

C++常用设计模式 1. 单例模式 单例模式有懒汉单例模式和饿汉单例模式,单例模式是该类不管创建多少次,都是共享的同一个类,懒汉模式与饿汉模式的最大区别在于在类被加载是是否被初始化(懒汉模式在类被加载是没有被初始化,而饿汉模式进行了初始化) - 懒汉单例模式 class A { private: A(){}//私有化构造函数 static A* m_A;//静态成员变量 class B{ public: ~B() { if(m_A) { delete m_A;

white_feng的博客 1803

优化C++设计模式:用模板代替虚函数与多态机制

MISRA C++ 标准对类型转换和虚函数使用做出严格规定,尤其在嵌入式系统中,以确保代码的可预测性和高效性。传统设计模式中虚函数和多态性引入会增加运行时开销,增加系统负担。然而,模板编程通过编译时决策代替运行时动态绑定,可以提升性能并降低内存消耗。 本文将尝试使用C++11改进常用的几个设计模式。

Where there is life, there is hope. 1581

23种设计模式--c++

并且可以看到,AbstractFactory模式通常都是使用 Factory 模式实现。

m0_67700979的博客 1856

C++设计模式

设计模式(Design Pattern)是,它是对代码设计经验的总结,提供了。设计模式不是具体的代码,而是一种,帮助开发者编写更灵活、可维护和可扩展的代码。接下来将会介绍常用的几种设计模式。

qq_63943454的博客 831

设计模式(C++实例)

感言 本文很长,但文中近乎有十之八九只能算是我在拜读各位大神大牛们分享的作品的笔记,这里只是我第一遍学习,我知道过了几天我肯定又会把看过的东西给忘记,所以就索性把各位大牛们的东西整理到了一起,方便以后的学习。1.(Strategy策略模式) 一个策略放到一个锦囊里。当用的时候,找到这个锦囊,从锦囊里拿出策略来使用。 注意:锦囊只是简单的装载和调用策略,锦囊里没有逻辑。策略会有更大的自主权,运行

菜鸟502的博客 1万+
上一篇: C++11实现生产者消费者模型
下一篇: Qt利用QFile内存映射实现进程间通信
小乖zypher
博客等级 码龄9年 4粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值