当前位置: 首页 > article >正文

C++设计模式之工厂模式(中)——工厂模式

工厂模式

  • 工厂模式
    • 介绍
    • 示例
    • 示例使用
    • 运行结果
    • 工厂模式与简单工厂模式区别

工厂模式

工厂模式在简单工厂模式的基础之上进行了改进。当需要生产的产品种类增加,可以通过新增子类工厂来生产,没有破坏程序设计原则中的开放封闭原则。

介绍

工厂模式先抽象出一个抽象工厂,再子类化抽象工厂,将对应产品对象的创建放在子类工厂中。也就是一个子工厂负责生产一种产品,即具体的产品对象由对应的具体的子工厂创建。当产品种类增加,只需增加新的子工厂来生产,遵守开放封闭原则。

示例

本示例接上篇的简单工厂模式。在原本示例的基础上进行改进。将采用简单工厂设计模式的示例改为采用工厂设计模式的示例。

class PenHolder 
{
public:
	virtual void introduce() = 0;
};

class PlasticPenHolder :public PenHolder 
{
public:
	void introduce()override 
	{
		cout << "I am PlasticPenHolder!" << endl;
	}
};

class IronPenHolder :public PenHolder 
{
public:
	void introduce()override 
	{
		cout << "I am IronPenHolder!" << endl;
	}
};

class BaseFactory 
{
public:
	virtual PenHolder * createPenHolder() = 0;
};

class PlasticFactory :public BaseFactory 
{
public:
	PenHolder* createPenHolder()override 
	{
		return new PlasticPenHolder;
	}
};

class IronFctory :public BaseFactory 
{
public:
	PenHolder* createPenHolder() override
	{
		return new IronPenHolder;
	}
};

示例使用

int main() 
{
	cout << "工厂模式输出:" << endl;
	BaseFactory *baseFactory1 = new PlasticFactory;
	PenHolder* penHolder1 = baseFactory1->createPenHolder();
	penHolder1->introduce();
	delete penHolder1;
	delete baseFactory1;

	BaseFactory *baseFactory2 = new IronFctory;
	PenHolder* penHolder2 = baseFactory2->createPenHolder();
	penHolder2->introduce();

	delete penHolder2;
	delete baseFactory2;

	return 0;
}

运行结果

在这里插入图片描述

工厂模式与简单工厂模式区别

相同点:
简单工厂模式和抽象工厂模式都是创建型设计模式。
不同点:
1.简单工厂模式只有一个工厂类,通过该工厂类生产不同的产品,代码结构简单易懂。工厂模式先是抽象出一个抽象工厂类,在抽象工厂类中提炼出一个纯虚的工厂函数,派生出不同的子工厂类,重写抽象类中的工厂函数,生产不同的产品对象,一种产品对应一个子工厂类,相对于简单工厂代码复杂性增加。
2.简单工厂模式当产品的种类增加时,需要修改工厂函数,破环了开放封闭原则。工厂模式当产品种类增加,只需增加新的子工厂类来生产新的产品,遵守了程序设计的开放封闭原则,具有很好的扩展性和易维护性。但也有一个弊端:当产品种类很多的时候,从抽象工厂类派生的子工厂类就会很多,造成了程序的继承过大。
3.建档工厂模式适用于需求相对简单的产品创建。工厂模式适用于复杂产品的创建需求。


http://www.kler.cn/a/148591.html

相关文章:

  • Python提取PDF和DOCX中的文本、图片和表格
  • 解决Anaconda出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url
  • 【STM32F1】——无线收发模块RF200与串口通信
  • 如何用C#和Aspose.PDF实现PDF转Word工具
  • MySql结合element-plus pagination的分页查询
  • 【QT】QSS
  • Golang与MongoDB的完美组合
  • 【多线程】-- 05 Lambda表达式
  • [带余除法寻找公共节点]二叉树
  • Python入门学习篇(四)——if详解
  • Leetcode刷题之用队列实现栈(C语言版)
  • 【rust:tauri-app踩坑记录】dangerousRemoteDomainIpcAccess 不适用于IP地址,临时解决方案
  • bash编程 数组和for循环的应用
  • Unity性能优化技巧篇
  • QTextEdit 是 Qt 框架中的一个小部件(Widget),用于显示和编辑多行文本内容
  • ES6模块化导出
  • 使用jmx_exporter监控Kafka
  • Week-T11-优化器对比试验
  • 计算机毕业设计php+bootstrap小区物业管理系统
  • 什么是高级语言、机器语言、汇编语言?什么是编译和解释?
  • 数据结构与算法之贪心: LeetCode 860. 柠檬水找零 (Typescript版)
  • 云服务器哪家便宜?亚马逊AWS等免费云服务器推荐
  • 【Python百宝箱】密码学之美:Python安全性实战手册
  • TMUX设置鼠标滚轮滑动来浏览之前的前面内容--复制文字
  • java: Internal error in the mapping processor: java.lang.NullPointerException
  • 精通Nginx(18)-FastCGI/SCGI/uWSGI支持