C++实现26种设计模式——工厂模式

C++创建型模式-工厂模式 一、基础知识 1.1 简单工厂模式 简单工厂模式(Simple Factory Pattern)专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。 1.2 简单工厂模式的角色 二、C++实现工厂模式 参考文献: 【1】 ...... 阅读详情


谨以此系列文,纪念被设计模式整懵逼的那些年。
笔者没看过设计模式书,仅仅在工作中用过26种设计模式中的几种,其余大部分都是看demo代码。所以有错漏的地方,请各位兄弟批评指正。
而代码是年前大佬甩给我的,当时没时间细究,现在终于闲下来好好研究了,所以demo代码从哪儿下的笔者也不知(对那位写下的demo的老兄表示感谢和歉意,真心不是侵权)。
而学习间,笔者亦将demo代码改了许多,感谢开源,回馈开源,笔者接下来的代码也全部贴出,不用下载。

先看运行

以结果为导向,来看待问题,会清晰得多:
在这里插入图片描述
有三个厂,分别是:奔驰、宝马、奥迪;
于是,有三款产品,分别是:单车、汽车、摩托;
所以,工厂模式运用起来,大概应该是这样的效果:XX厂生产XX产品。

再来看main函数:

int main()
{
	// 奔驰
	AbstractFactory* pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::BENZ_FACTORY);
	ICarProduct *pCar = pFactory->CreateCar();
	IBikeProduct *pBike = pFactory->CreateBike();
	cout << pFactory->Name() << pCar->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);
	
	// 宝马
	pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::BMW_FACTORY);
	IMotoBikeProduct* pMoto = pFactory->CreateMotoBike();
	pBike = pFactory->CreateBike();
	cout << pFactory->Name() << pMoto->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);

	// 奥迪
	pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::AUDI_FACTORY);
	pMoto = pFactory->CreateMotoBike();
	pBike = pFactory->CreateBike();
	cout << pFactory->Name() << pMoto->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);

	system("pause");
}

看着这样齐整的代码,咱再来想,要如何实现后面的类,才能实现后面的效果。
首先,很明显,AbstractFactory是个抽象工厂,CreateFactory也肯定是个静态函数,而这个函数就是通过FACTORY_TYPE这个枚举,来区分new出不同的工厂来的。
其次,不同的工厂,能创造出不同的产品(CreateCar()、CreateBike()、CreateMotoBike()),不用说肯定是多态,所以,工厂模式该怎么写,也大概能推断出来了。

源码(工厂类)

class AbstractFactory {
public:
	AbstractFactory() {}
	~AbstractFactory() {}
	virtual IBikeProduct* CreateBike() = 0;
	virtual IMotoBikeProduct* CreateMotoBike() = 0;
	virtual ICarProduct* CreateCar() = 0;

	static AbstractFactory* CreateFactory(FACTORY_TYPE type);

	string Name() { return m_name; }

protected:
	string m_name;
};


class BenChiFactory : public AbstractFactory {
public:
	BenChiFactory() { m_name = "奔驰"; }
	~BenChiFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }
};

class BaoMaFactory : public AbstractFactory {
public:
	BaoMaFactory() { m_name = "宝马"; }
	~BaoMaFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }

};

class AodiFactory : public AbstractFactory {
public:
	AodiFactory() { m_name = "奥迪"; }
	~AodiFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }

};

AbstractFactory* AbstractFactory::CreateFactory(FACTORY_TYPE type) {
	switch (type)
	{
	case BENZ_FACTORY:
	{
		return new BenChiFactory;
	}
	break;
	case BMW_FACTORY:
	{
		return new BaoMaFactory;
	}
	break;
	case AUDI_FACTORY:
	{
		return new AodiFactory;
	}
	break;
	default:
		break;
	}
}

源码(产品类)

class IProduct {
public:
	IProduct() {}
	~IProduct() {}
	string Name() { return m_name; }
protected:
	string m_name;
};

enum FACTORY_TYPE {
	BENZ_FACTORY = 0,
	BMW_FACTORY,
	AUDI_FACTORY
};

class IBikeProduct : public IProduct {
public:
	IBikeProduct() { m_name = "单车"; }
};

class IMotoBikeProduct : public IProduct {
public:
	IMotoBikeProduct() { m_name = "摩托"; }
};

class ICarProduct : public IProduct {
public:
	ICarProduct() { m_name = "汽车"; }

};

完整源码

#include "pch.h"
#include <iostream>
#include <string>

using namespace std;

#ifndef SAFE_DELETE(p) 
#define SAFE_DELETE(p){if(p){delete p; p = nullptr;}}
#endif

class IProduct {
public:
	IProduct() {}
	~IProduct() {}
	string Name() { return m_name; }
protected:
	string m_name;
};

enum FACTORY_TYPE {
	BENZ_FACTORY = 0,
	BMW_FACTORY,
	AUDI_FACTORY
};

class IBikeProduct : public IProduct {
public:
	IBikeProduct() { m_name = "单车"; }
};

class IMotoBikeProduct : public IProduct {
public:
	IMotoBikeProduct() { m_name = "摩托"; }
};

class ICarProduct : public IProduct {
public:
	ICarProduct() { m_name = "汽车"; }

};


class AbstractFactory {
public:
	AbstractFactory() {}
	~AbstractFactory() {}
	virtual IBikeProduct* CreateBike() = 0;
	virtual IMotoBikeProduct* CreateMotoBike() = 0;
	virtual ICarProduct* CreateCar() = 0;

	static AbstractFactory* CreateFactory(FACTORY_TYPE type);

	string Name() { return m_name; }

protected:
	string m_name;
};


class BenChiFactory : public AbstractFactory {
public:
	BenChiFactory() { m_name = "奔驰"; }
	~BenChiFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }
};

class BaoMaFactory : public AbstractFactory {
public:
	BaoMaFactory() { m_name = "宝马"; }
	~BaoMaFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }

};

class AodiFactory : public AbstractFactory {
public:
	AodiFactory() { m_name = "奥迪"; }
	~AodiFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }

};

AbstractFactory* AbstractFactory::CreateFactory(FACTORY_TYPE type) {
	switch (type)
	{
	case BENZ_FACTORY:
	{
		return new BenChiFactory;
	}
	break;
	case BMW_FACTORY:
	{
		return new BaoMaFactory;
	}
	break;
	case AUDI_FACTORY:
	{
		return new AodiFactory;
	}
	break;
	default:
		break;
	}
}


int main()
{
	// 奔驰
	AbstractFactory* pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::BENZ_FACTORY);
	ICarProduct *pCar = pFactory->CreateCar();
	IBikeProduct *pBike = pFactory->CreateBike();

	cout << pFactory->Name() << pCar->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);

	// 宝马
	pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::BMW_FACTORY);
	IMotoBikeProduct* pMoto = pFactory->CreateMotoBike();
	pBike = pFactory->CreateBike();
	cout << pFactory->Name() << pMoto->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);

	// 奥迪
	pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::AUDI_FACTORY);
	pMoto = pFactory->CreateMotoBike();
	pBike = pFactory->CreateBike();
	cout << pFactory->Name() << pMoto->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);

	system("pause");
}


C++——设计模式 面向对象的优点和缺点 面向对象的三大特点 设计模式的六大原则 单例模式(线程安全) 工厂方法模式 适配器模式 代理模式 观察者模式 策略模式 备忘录模式 模板模式 状态模式 责任链模式 装饰模式 命令模式 阅读详情

相关推荐

功率电感的设计步骤

学习视频原链接截图1截图2。

qq_32419593的博客 4887

C++之工厂(factory)模式

0. 简介 继单例模式写完后,我觉得对于C++的高级用法可以来开一个专栏来专门整理与阐述,这里,我将以我们最常用的工厂模式开始,来逐步的共同学习。 https://www.cnblogs.com/hebaichuanyeah/category/824625.html ......

lovely_yoshino的博客 1万+

RAG在医药行业为什么80%都翻车了?

这篇文章不是要劝你别做RAG,而是把坑说清楚。医药行业有它的特殊性——监管压力、专业术语密度、多语言混排、文档结构复杂——这些因素叠加在一起,让标准RAG教程里的那套方法论几乎直接失效

qq_31808385的博客 635

C++工厂模式

条件:将该类的构造函数私有化,目的是禁止其他程序创建该类的对象,同时也是为了提醒查看代码的人我这里是在使用单例模式,防止他人将这里任意修改。指向自己实例的私有引用在被类方法(creatinstance)调用时被初始化,只有静态成员变量才能在没有创建对象时进行初始化,并且类的静态成员在第一次使用时不会再被初始化,保证了单例,因此设置为静态。通过类方法(creatinstance) 获取instance,类属性instance为静态的(static),则需要类的静态方法才能调用,因此该类方法应设为静态的。

zt18786458319的博客 3069

Jetson Nano摄像头选型与配置全攻略:CSI与USB接口实战指南

在嵌入式视觉与边缘计算项目中,摄像头作为核心传感器,其选型与配置直接影响系统性能。CSI(Camera Serial Interface)和USB(Universal Serial Bus)是两种主流接口,前者通过MIPI CSI-2协议直接与SoC通信,具备低延迟、高带宽特性,适合实时性要求高的应用;后者基于通用串行总线标准,即插即用,通用性强。在NVIDIA Jetson Nano平台上,合理选择摄像头接口并优化驱动配置,能充分发挥其GPU加速优势,提升图像处理流水线效率。本文聚焦Jetson Nano

weixin_29190651的博客 323

别再硬啃理论了!手把手教你用Simulink搭VSG并网模型,模拟线路故障(含三相故障模块详解)

本文提供了一份详细的Simulink VSG并网模型搭建指南,特别聚焦于三相故障模块的配置与仿真。通过逐步指导,帮助电力电子工程师掌握从基础电路搭建到复杂故障模拟的全流程,包括单相接地、两相短路等典型故障的波形分析与参数设置技巧,有效弥合理论与实践的鸿沟。

weixin_29057237的博客 317

C++之工厂模式

对于工厂模式(简单工厂、工厂方法、抽象工厂)的总结。

flyingcloud6的博客 5620

CODESYS EtherCAT通讯断了怎么办?手把手教你用ST语言写状态监测程序(附完整代码)

本文详细解析了CODESYS平台下EtherCAT通讯中断的故障排查与恢复方法,通过ST语言编写状态监测程序实现链路监测、故障隔离和伺服恢复。文章包含完整代码示例,帮助工程师快速诊断EtherCAT网络问题,提升工业自动化设备的运行稳定性。

weixin_30919571的博客 209

c++ 工厂模式

工厂模式(FactoryPattern)是设计模式中的一种,属于创建型模式。它的核心思想是为了解耦对象的创建过程与使用过程,让代码更加灵活,易于扩展和维护。工厂模式通过引入一个工厂类来负责对象的创建,而客户端代码只需要与这个工厂类交互,无须关心具体的对象创建细节。封装性:隐藏了对象创建的具体逻辑,客户端代码不需要知道对象是如何被创建出来的。开放封闭原则:当需要添加新的产品时,只需要增加一个新的具体产品类和修改工厂类(或新增一个工厂子类),不需要修改现有代码,符合软件设计的开放封闭原则。

weixin_45672157的博客 2810

从零搭建风电场:手把手教你用WAsP+WindPRO完成风资源评估全流程

本文详细介绍了从零开始搭建风电场的全流程,重点讲解如何使用WAsP和WindPRO进行风资源评估和风场布局优化。内容包括软件配置、数据采集规范、风图谱建模实战、机组选型策略以及常见问题解决方案,帮助工程师掌握风电开发的核心技术,提升项目成功率。

year5的博客 371

零基础学习CANoe Panel(17)—— Panel CAPL Function

CANoe内置了几个CAPLFunction,允许我们在CAPL运行时动态的更改Panel控件的属性,比如打开某个panel,禁用某个控件,更改控件颜色等。

蚂蚁小兵 3517

这些设计模式在现代C++中如何应用

优势:智能指针管理内存,避免泄漏;lambda 和替代继承,减少样板代码;移动语义提升性能。建议:优先使用现代特性(如 C++17 的或 C++20 的 concepts)来简化模式实现。实际开发中,结合具体需求选择模式,避免过度设计。注意事项:确保线程安全(使用std::mutex或原子操作),并遵循 RAII 原则(Resource Acquisition Is Initialization)管理资源。通过以上示例,您可以看到现代C++如何使设计模式更易于实现和维护。

2509_94270630的博客 415

网络分析工具Wireshark系列专栏:01-专栏导读

随着人工智能技术的普及,越来越多的博主开始利用AI进行内容创作,导致优快云等平台上充斥着大量低质量的洗稿文章,严重影响了技术软文的质量和可信度。为了应对这一现象,提升技术内容的质量,瑞哥决定推出系列技术专栏,为大家带来系统、深入且高质量的技术学习资源。这些专栏将帮助读者从入门到精通,特别适合习惯通过文档学习的技术爱好者。作为首个专栏,我们将聚焦于Wireshark——一款广受欢迎的网络协议分析工具。根据优快云后台的反馈,许多读者表示Wireshark是他们欠缺的一项技能。因此,本专栏将通过精心设计的课程

网络技术联盟站 359

26种设计模式讲解 干货总结,非常干!(每一个都附C++完整代码示例实现)

26种设计模式讲解 干货总结,非常干!(每一个都附C++完整代码示例实现)

Warren++的博客 4475

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c++ 24种设计模式

C++ 常用设计模式(学习笔记) 设计模式 1、工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。 1.1、简单工厂模式 主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。...

qq_37871669的博客 2435

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++一分钟之-设计模式:工厂模式与抽象工厂

在软件工程中,设计模式是一种通用的解决方案,用于解决常见的设计问题。工厂模式和抽象工厂模式是创建型设计模式中的两个重要成员,它们帮助我们创建对象而不需要暴露创建逻辑,同时使系统在不修改现有代码的情况下可以扩展。 工厂模式 工厂模式的核心思想是定义一个创建产品对象的接口,但是让子类决定实例化哪一个类。这样,工厂方法使一个类的...

cnzzs的博客 1096

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

26-C++设计模式总结

C++设计模式总结 一个目标:管理变化,提高复用! 两种手段:分解VS.抽象 八大原则: (1)依赖倒置原则( DIP) (2)开放封闭原则( OCP) (3)单一职责原则( SRP) (4)Liskov 替换原则( LSP) (5)接口隔离原则( ISP) (6)对象组合优于类继承 (7)封装变化点 (8)面向接口编程 重构技法 (1)静态 → 动态 (2)早绑定→ 晚绑定 (3)继承→ 组合 (4)编译时依赖→ 运行时依赖 (5)紧耦合→ 松耦合 ...

HJ的技术博客 284

【设计模式】工厂模式之模板工厂模式详解

模板工厂模式(Template Factory)是泛型编程与工厂模式的完美结合,利用C++模板特性实现编译期多态和零开销抽象,尤其适合高性能、强类型场景。

浩瀚之水的专栏 1068

C++设计模式——抽象工厂模式

问题描述 之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理;由于工厂方法模式创建的对象都是继承于Product的,所以工厂方法模式中,每个工厂只能创建单一种类的产品,当需要生产一种全新的产品(不继承自Product)时,发现工厂方法是心有余而力不足。 举个例子来说:一个显示器电路板厂商,旗下...

a5607754的博客 160

C++设计模式——工厂方法模式

问题描述 之前讲到了C++设计模式——简单工厂模式,由于简单工厂模式的局限性,比如:工厂现在能生产ProductA、ProductB和ProductC三种产品了,此时,需要增加生产ProductD产品;那么,首先是不是需要在产品枚举类型中添加新的产品类型标识,然后,修改Factory类中的switch结构代码。是的,这种对代码的修改,对原有代码的改动量较大,易产生编码上的错误(虽然很简...

a5607754的博客 114

设计模式C++实现(1)——工厂模式

该文章转载自:http://blog.youkuaiyun.com/wuzhekai1985 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话...

130

C++设计模式之-工厂模式的总结

工厂模式分为3种,即简单工厂模式、工厂方法模式、抽象工厂模式,其实大同小异,总结下来就是: 简单工厂模式:一个工厂,多个产品。产品需要有一个虚基类。通过传入参数,生成具体产品对象,并利用基类指针指向此对象。通过工厂获取此虚基类指针,通过运行时多态,调用子类实现。 1 // Factory.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #in...

dayan2391的博客 105

《大话设计模式》c++实现 工厂模式

工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 介绍 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 主要解...

anqiu4023的博客 122

两种语言实现设计模式(C++和Java)(一:工厂模式)

本篇开始记录实现设计模式在工作中的两种常见语言上的实现。 本篇介绍最简单的工厂模式。 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。 使用情景: 在不确定会有多少个处理操作时应该考虑使用简单工厂模式,如针对同样的接...

aozhimen9773的博客 229
上一篇: Vulkan环境搭建的详细方法(for Windows)
下一篇: C++实现26种设计模式之——适配器模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值