C++之工厂模式

这篇具有很好参考价值的文章主要介绍了C++之工厂模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、为什么要使用工厂模式

优点

缺点

二、简单工厂(Simple Factory)

好处:

不足:

三、工厂方法:

好处:

不足:

四、抽象工厂(Abstract   Factory)


一、为什么要使用工厂模式

主要是对对象的创建进行了一个封装;
因此也属于创建型模式。

目的:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

主要解决:主要解决接口选择的问题。

优点

  1. 一个调用者想创建一个对象,只要知道其名称就可以了;
  2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以;
  3. 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

二、简单工厂(Simple Factory)

把对象的创建封装在一个接口函数里面,通过传入不同的标识,返回创建的对象

C++之工厂模式

好处:

可以看到,简单工厂可以做到,让用户创建对象的时候只需要知道对象的名称(BMWAUDI)就好,而不需要关心创建对象的细节(BMW是如何建造的、型号是什么等等细节)。

不足:


每当我们想要扩展对象的时候(增加BENZ的对象)就需要在SimpleFactory类中添加代码,增加switch后面的case选项。这样一来,就需要修改源代码。灵活性非常的差!!!

那么,能不能做到添加对象的时候,不对现有代码进行修改呢?(也就是我们开发软件时候需要遵守的开-闭原则)

这便是接下来工厂方法

三、工厂方法:

一个派生类就代表着一个工厂,每个工厂都有具体要生产的产品。

FActory基类,提供了一个纯虚函数(创建产品),定义派生类(具体产品的工厂)负责创建对应的产品,

//工厂方法:
class Factory
{
public:
	virtual Car* createCar(string name) = 0;
};
//宝马工厂
class BMWFactory : public Factory
{
public:
	Car* createCar(string name) 
	{
		return new BMW(name);
	}
};
//奥迪工厂
class AudiFactory : public Factory
{
public:
	Car* createCar(string name)
	{
		return new Audi(name);
	}
};

void main()
{
	Factory* bmwfty = new BMWFactory();
	Factory* audifty = new AudiFactory();

	Car* p1 = bmwfty->createCar("X6");
	Car* p2 = audifty->createCar("A6");

	p1->show();
	p2->show();
}

当我们想要增加新的工厂:比如说奔驰工厂的时候,根本不用去管宝马和奥迪,只需要增加一个新的工厂就行了,所以说是符合了软件设计的          “开闭原则”   : 对已有的功能关闭,对扩展开放

好处:

可以做到不同的产品,在不同的工厂里面创建(模块化非常清晰),能够对现有工厂,以及产品的修改关闭

不足:

实际上,很多产品是有关联关系的,属于一个产品簇,不应该放到不同的工厂里面去创建,这样
一是不符合实际的产品对象创建逻辑,二是工厂类太多了,不好维护

四、抽象工厂(Abstract   Factory)

应用于有关联关系的产品

上面的简单工厂已经能够满足基本的要求了,但是在实际生活中,比如宝马企业,不止有汽车,还有别的系列产品,比如:车灯、轮胎。。。也就是跟汽车有关的一组产品

代码

继承关系如下:

//系列产品1:
class Car 
{
public:
	Car(string name):_name(name)
	{}
	virtual void show()
	{}

protected:
	std::string _name;
};

class BMW:public Car
{
public:
	BMW(string name):Car(name)
	{}
	void show() {
		cout << "这是一辆宝马" << endl;
	}
};

class Audi :public Car
{
public:
	Audi(string name) :Car(name)
	{}
	void show() {
		cout << "这是一辆奥迪" << endl;
	}
};
//系列产品 2:
class Light
{
public:
	virtual void show()
	{
	}
};
class BmwLight :public Light
{
public:
	void show()
	{
		cout << "BMW 的 Light" << endl;
	}
};
class AudiLight :public Light
{
public:
	void show()
	{
		cout << "Audi 的 Light" << endl;
	}
};

抽象工厂的实现:

//工厂方法 ==>> 抽象工厂(对一组关联关系的产品簇提供产品对象的统一创建)
class AbstractFactory
{
public:
	virtual Car* createCar(string name) = 0;//工厂方法  创建汽车
	virtual Light* createLight() = 0;// 工厂方法  创建汽车关联的产品,车灯
};
//宝马工厂
class BMWFactory : public AbstractFactory
{
public:
	Car* createCar(string name) 
	{
		return new BMW(name);
	}
	Light* createLight()
	{
		return new BmwLight();
	}
};
//奥迪工厂
class AudiFactory : public AbstractFactory
{
public:
	Car* createCar(string name)
	{
		return new Audi(name);
	}
	Light* createLight()
	{
		return new AudiLight();
	}
};

使用:

void main()
{
	AbstractFactory* bmwfty = new BMWFactory();
	AbstractFactory* audifty = new AudiFactory();

	Car* p1 = bmwfty->createCar("X6");
	Car* p2 = audifty->createCar("A6");
	p1->show();
	p2->show();

	Light* l1 = bmwfty->createLight();
	Light* l2 = audifty->createLight();
	l1->show();
	l2->show();
}

C++之工厂模式文章来源地址https://www.toymoban.com/news/detail-497836.html

到了这里,关于C++之工厂模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么pycharm远程连接服务器运行时总会出现找不到文件或目录

    目录 解决方法 为什么会出现这样的问题 我们需要修改一个设置 具体步骤如下: 1、右下角点击它,选择interpreter setting  2、进入下图界面,点击箭头所指位置,选择show all 3、进入下图界面,选择你要修改的python interpreter,点哪个🖊进行修改    4、进入下图界面,默认情况下

    2024年02月15日
    浏览(51)
  • Oracle21C:Windows版本的安装、卸载、环境变量配置、避坑指南|ORA-12514|为什么安装目录没有bin目录

    安装Oracle21C(点击下载),因不得其法,各种报错,导致不能正常使用Oracle。  提示:版本是Oracle21C, 其他版本可能存在差异, 目前官网已更新到Oracle23C (进官网后,向下滚动,可下载其他版本)。  1)Oracle下载地址:官网下载页面 2)navecat下载地址:navecate 3)sqlplus下载地

    2024年01月25日
    浏览(39)
  • 《让云落地 云计算服务模式》第一章 [为什么是云计算,为什么是现在] 学习

    “时间会带来标准和最佳实践” 1.云计算的由来 云计算是从中央主机时代,向个人计算机时代诞生带来的分布式主从架构时代,以及企业能够通过覆盖全球的计算机网络联系世界的互联网时代的自然发展。 每一次新的技术革命都会伴随着阻力。早期的试用者和风险承受者会

    2024年04月28日
    浏览(31)
  • 为什么我不再推荐枚举策略模式

    一、为什么讲策略模式 二、经典策略模式 三、基于枚举的策略模式 四、基于工厂的策略模式 策略模式,应该是工作中比较常用的设计模式,调用方自己选择用哪一种策略完成对数据的操作,也就是“一个类的行为或其算法可以在运行时更改” 我个人的理解是 将一些除了过

    2024年02月07日
    浏览(34)
  • 为什么要学习C++

    UINX操作系统诞生之初是用汇编语言编写的。 随着UNIX的发展,汇编语言的开发效率成为一个瓶颈。 寻找新的高效开发语言成为UNIX开发者需要解决的问题。 当时BCPL语言成为了当时的选择之一。 Ken Thomposn对BCPL进行简化得到了B语言。 但是B语言不是直接生成机器码,而是生成中

    2024年02月10日
    浏览(38)
  • 为什么 C 语言没有被 C++ 取代?

    今日话题,为什么 C 语言没有被 C++ 取代?C语言之所以没有被C++完全取代,有几个主要原因。首先,C++的编译器实现相对复杂,这对于一些嵌入式平台来说是一个问题。许多嵌入式系统只支持C语言,因此C++在这些平台上无法使用。即使在支持C++的嵌入式平台上,也常常存在不

    2024年01月19日
    浏览(54)
  • DCL 单例模式设计为什么需要 volatile 修饰实例对象

     DCL 问题,是在基于双重检查锁设计下的单例模式中,存在不 完整对象的问题。而这个不完整对象的本质,是因为指令重排序导致的。 当我们使用 instance=new DCLExample()构建一个实例对象的时候,因为 new 这个操作并不是原子的。所以这段代码最终会被编译成 3 条指令: 为对象

    2024年02月08日
    浏览(41)
  • ThinkPHP为什么用PHP+Swoole协程模式部署运行

    看很多ThinkPHP框架的程序商城等系统,现在都用PHP+Swoole协程来运行。在说Swoole前我们先了解下传统PHP模式。 互联网发展早期,大部分项目的业务逻辑并没有那么复杂,技术生态相对比较简单,也没有 Composer 这样的包管理系统,程序代码足够简单。大部分 PHP 项目没有框架,或

    2024年01月17日
    浏览(38)
  • c++ 移动构造方法为什么要加noexcept

    最近看了候捷老师的c++的教程, 他说移动构造方法要加noexcept,  在vector扩容的时候, 如果有移动构造方法没有加noexcept,是不会调用的. 个人感觉有些神奇, 这就去查下一探究竟. 测试代码如下:  执行结果如下: 我们知道vector 是要扩容的, 在A(A a) 并没有添加noexcept, 所

    2024年02月10日
    浏览(64)
  • 有了NULL,为什么C++还需要nullptr?

    目录 1.引言 2.类型安全 3.函数重载 4.代码清晰性 5.示例 6.总结 在C++编程中,nullptr是一个类型安全的空指针常量,自C++11起被引入。然而,在此之前,程序员们通常使用NULL或0来表示空指针。那么,为什么有了NULL之后,C++还需要引入nullptr呢?本文将从类型安全、函数重载和代

    2024年02月21日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包