设计模式之简单工厂模式(Simply Factory)摘录

2023-11-17

从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

         简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

         该模式中包含的角色及其职责:(1)、工厂(Creator)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑(一个个if/else分支或者switch/case分支)。工厂类可以被外界直接调用,创建所需的产品对象;(2)、抽象产品(Product)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口;(3)、具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

         优缺点:(1)、优点:工厂类是整个模式的关键,包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责”消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的。明确了各自的职责和权利,有利于整个软件体系结构的优化。(2)、缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的如果需要添加新的类,则就需要改变工厂类了。当系统中的具体产品类不断增多的时候,可能会出现要求工厂类根据不同条件创建不同实例的需求。这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。这些缺点在工厂方法模式中得到了一定的克服。

         使用场景:工厂类负责创建的对象比较少;客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

         简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加。工厂方法模式每个具体工厂类只完成单一任务。简单工厂模式的工厂类是个静态类,在客户端无需实例化。

         工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。

         抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。

示例代码:

#include <iostream>
using namespace std;

typedef enum ProductTypeTag
{
	ADD = 1,
	SUB = 2,
	MUL = 3,
	DIV = 4
}PRODUCTTYPE;

//基类
class COperation
{
public:
	COperation() : m_numA(0.0), m_numB(0.0) 
	{
		cout<<"COperation constructor"<<endl;
	}

	virtual ~COperation() 
	{
		cout<<"COperation destructor"<<endl;
	}

	virtual double GetResult() = 0;

protected:
	double m_numA;
	double m_numB;
};

//加法
class CAddOperation : public COperation
{
public:
	CAddOperation(double a, double b)
	{
		cout<<"CAddOperation constructor"<<endl;
		m_numA = a;
		m_numB = b;
	}

	virtual ~CAddOperation()
	{
		cout<<"CAddOperation destructor"<<endl;
	}

	virtual double GetResult()
	{
		return (m_numA + m_numB);
	}
};

//减法
class CSubOperation : public COperation
{
public:
	CSubOperation(double a, double b)
	{
		cout<<"CSubOperation constructor"<<endl;
		m_numA = a;
		m_numB = b;
	}

	virtual ~CSubOperation()
	{
		cout<<"CSubOperation destructor"<<endl;
	}

	virtual double GetResult()
	{
		return (m_numA - m_numB);
	}
};

//乘法
class CMulOperation : public COperation
{
public:
	CMulOperation(double a, double b)
	{
		cout<<"CMulOperation constructor"<<endl;
		m_numA = a;
		m_numB = b;
	}

	virtual ~CMulOperation()
	{
		cout<<"CMulOperation destructor"<<endl;
	}

	virtual double GetResult()
	{
		return (m_numA * m_numB);
	}
};

//除法
class CDivOperation : public COperation
{
public:
	CDivOperation(double a, double b)
	{
		cout<<"CDivOperation constructor"<<endl;
		m_numA = a;
		m_numB = b;
	}

	virtual ~CDivOperation()
	{
		cout<<"CDivOperation destructor"<<endl;
	}

	virtual double GetResult()
	{
		return (m_numA / m_numB);
	}
};

//工厂类
class CCalculatorFactory
{
public:
	static COperation* CreateOperation(PRODUCTTYPE type, double a, double b)
	{
		switch (type)
		{
		case 1:
			return new CAddOperation(a, b);
			break;
		case 2:
			return new CSubOperation(a, b);
			break;
		case 3:
			return new CMulOperation(a, b);
			break;
		case 4:
			return new CDivOperation(a, b);
			break;
		default:
			return NULL;
		}
	}
};

int main()
{
	CCalculatorFactory* calFactory = new CCalculatorFactory();
	int type = 0;
	double a = 10, b = 2;

	type = 1;
	COperation* operation = calFactory->CreateOperation((PRODUCTTYPE)type, a, b);
	if (operation) {
		cout<<operation->GetResult()<<endl;
		delete operation;
		operation = NULL;
	}

	type = 2;
	operation = calFactory->CreateOperation((PRODUCTTYPE)type, a, b);
	if (operation) {
		cout<<operation->GetResult()<<endl;
		delete operation;
		operation = NULL;
	}

	type = 3;
	operation = calFactory->CreateOperation((PRODUCTTYPE)type, a, b);
	if (operation) {
		cout<<operation->GetResult()<<endl;
		delete operation;
		operation = NULL;
	}

	type = 4;
	operation = calFactory->CreateOperation((PRODUCTTYPE)type, a, b);
	if (operation) {
		cout<<operation->GetResult()<<endl;
		delete operation;
		operation = NULL;
	}

	if (calFactory) {
		delete calFactory;
		calFactory = NULL;
	}

	/*result
		COperation constructor
		CAddOperation constructor
		12
		CAddOperation destructor
		COperation destructor
		COperation constructor
		CSubOperation constructor
		8
		CSubOperation destructor
		COperation destructor
		COperation constructor
		CMulOperation constructor
		20
		CMulOperation destructor
		COperation destructor
		COperation constructor
		CDivOperation constructor
		5
		CDivOperation destructor
		COperation destructor
	*/

	return 0;
}

简单工厂模式结构图:


简单工厂模式、工厂方法模式、抽象工厂模式三者之间的区别:
(1)、简单工厂模式:一个工厂类(负责创建所有实例的内部逻辑,此工厂类可以被外界直接调用,此工厂类是个静态类,在客户端无需实例化),一个抽象产品类(所有具体产品类的父类,负责描述所有实例共有的公共接口),多个具体产品类。
(2)、工厂方法模式:一个抽象工厂类,多个具体工厂类(每个具体工厂类只能创建一个具体产品类实例),一个抽象产品类,多个具体产品类。
(3)、抽象工厂模式:一个抽象工厂类,多个具体工厂类(每个具体工厂类可以创建多个具体产品类实例),多个抽象产品类(每个抽象产品类可以派生出多个具体产品类),多个具体产品类。

参考文献:

1、  http://baike.baidu.com/view/1227908.htm

2、  http://www.cnblogs.com/beniao/archive/2008/08/09/1263318.html

3、  http://blog.csdn.net/lilu_leo/article/details/7592678

4、  http://www.jellythink.com/archives/42

5、  http://www.cppblog.com/wolf/articles/122609.html

6、  http://www.mianwww.com/html/2011/12/12375.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式之简单工厂模式(Simply Factory)摘录 的相关文章

  • 推荐系统:GBDT+LR简介

    1 GBDT LR简介 前面介绍的协同过滤和矩阵分解存在的劣势就是仅利用了用户与物品相互行为信息进行推荐 忽视了用户自身特征 物品自身特征以及上下文信息等 导致生成的结果往往会比较片面 而这次介绍的这个模型是2014年由Facebook提出
  • ubuntu通过apt安装软件的安装路径

    jdk usr lib jvm 具体jdk版本 tomcat usr share tomcat具体版本
  • 把ffmpeg放到后台自动运行

    最近一个项目 需要用ffmpeg把rtsp流转成ts流 由于rtsp服务器有可能关闭 需要自动的重启ffmpeg去连接rtsp服务器 1 编写一个用ffmpeg转TS流的脚本rtsp2ts sh ffmpeg i rtsp xx xx xx
  • pyd文件介绍

    pyd一般是python外的其他语言如C C 编写的python扩展模块 即python的一个动态链接库 与dll文件相当 在linux系统中一般为 so文件 也有的时候 为了对python文件进行加密 会把python模块编译成 pyd文
  • Unity基础学习之C#学习(二)

    C 程序三大结构 0 前言 1 分支结构 1 1 if语句 1 2 switch语句 2 循环结构 2 1 while循环 2 2 do while循环 2 3 for循环 最常用 2 4 foreach循环 主要用于迭代遍历 3 brea
  • oracle查询结果添加序列,SQL查询结果增加序列号

    SQL查询记录中增加序列号 根据学生成绩在查询结果中增加排名字段 1 SELECT ROW NUMBER OVER ORDER BY SCORE ASC AS RANK NAME SCORE FROM GRADE ORDER BY SCOR

随机推荐

  • vue-element-admin使用Tinymce富文本插件的踩坑填坑

    vue element admin项目的作者已经封装好了Tinymce富文本组件 我直接在Git上下载demo运用到自己项目里 这是Git地址 https github com PanJiaChen vue element admin 一
  • [0x7FFBFB69D3E0] ANOMALY: meaningless REX prefix used问题的修复

    0x7FFBFB69D3E0 ANOMALY meaningless REX prefix used 困扰了我几个礼拜 导致idea git 用不了 差点重装系统了 今天还好 解决了 用360 各种修复 各种操作 cmd 没有那串东西咯 各
  • 宏观经济浅学20210724

    https www bilibili com video BV1Ng4y1B7ig p 14 8大类 251个基本分类 700个品种 120万个商品
  • 写一篇有关机器学习的论文

    写一篇有关机器学习的论文 需要从以下几个方面进行阐述 机器学习的定义 首先要明确机器学习的定义 并简要介绍其历史发展 机器学习的分类 接着介绍机器学习的分类方法 例如监督学习 非监督学习 半监督学习 强化学习等 机器学习的应用 最后详细阐述
  • 智能城市dqn算法交通信号灯调度_新基建激发AI新动力,助推人工智能产业化落地进程...

    8月7日 9日 由中国计算机学会主办 香港中文大学 深圳 雷锋网联合承办的全球人工智能和机器人峰会在深圳开幕 峰会期间揭晓了 2020AI 最佳成长榜 千方科技旗下博观智能凭借在智慧城市多个细分领域的商用落地实力 斩获 AI 智慧城市 领域
  • python判断语句

    判断语句 if if 语句的判断语法 if 要判断的条件 条件成立时 要做的事情 else语法格式如下 if 要判断的条件 条件成立时 要做的事情 else 条件不成立 要做的事情 逻辑运算 只有多个条件都满足 才能执行后续代码 这个时候需
  • 两张动图-彻底明白TCP的三次握手与四次挥手

    背景描述 通过上一篇中网络模型中的IP层的介绍 我们知道网络层 可以实现两个主机之间的通信 但是这并不具体 因为 真正进行通信的实体是在主机中的进程 是一个主机中的一个进程与另外一个主机中的一个进程在交换数据 IP协议虽然能把数据报文送到目
  • C++课程设计之高校学生简单信息管理系统

    给大家分享一个用C 语言编写的高校学生信息管理系统 程序比较简单 也比较好理解 适合刚入门C 的程序小白 大学生做C 相关的课程设计也可以给你提供一些思路 或者在此基础上修改一下 添加一些自己的类和成员函数 让系统的功能更加的强大 系统功能
  • iOS APP 启动页和icon图标尺寸

    前言 记录一下竖屏iPhone启动页和icon图标尺寸 好记性不如烂笔头 1 启动页尺寸 320x480 640x960 640x1136 750x1334 1125x2436 1242x2208 1242x2688 828x1792 2
  • chatgpt小程序安装指引

    chatgpt小程序安装指引 JAVA 创建数据库 名字随意 数据库编码为utf8mb4 导入sql文件 在renren api db目录下面 第一次导入数据的先执行chatgpt sql文件 在根据日期先后顺序执行 已导入过的同志 根据更
  • html chm 打不开,Win7系统中出现CHM打不开的具体解决方法

    一部分用户在使用Win7系统的时候 出现CHM打不开的情况 该怎么处理呢 下文就为你们带来了Win7系统中出现CHM打不开的具体解决方法 方法一 1 可以对注册表进行操作 按快捷键 Win R 启动 运行 程序 2 在 运行 程序的输入框中
  • 舒尔补-边际概率-条件概率

    margin求边际概率的时候喜欢通过舒尔补的形式去操作信息矩阵 如p b c 求积分p a b c da 从上图可知 边缘概率直接看协方差矩阵比较方便 边际概率的方差就是取对应联合分布中相应的协方差块 信息矩阵是由舒尔补的形式计算 此形式也
  • GBDT调参指南

    GBDT分类器和回归器的大部分参数都是相同的 除了损失函数的选项有些不同 因此下面我们统一说明各个参数的意义以及在什么情境下做什么调整方法 一 GBDT的boosting框架参数 1 n estimators 代表弱学习器的最大个数 即最多
  • Python+OpenCV人脸识别签到考勤系统

    前言 本项目为IOT实验室人员签到考勤设计 系统实现功能 1 人员人脸识别并完成签到 签退 2 考勤时间计算 3 保存考勤数据为CSV格式 Excel表格 PS 本系统2D人脸识别 节约了繁琐的人脸识别训练部分 简洁快捷 该项目为测试版 正
  • mac电脑的C语言安装包,Mac上运行C/C++程序

    由于工作需要 要在Mac环境里面运行C程序 遇到的问题及解决方法如下 1 确认环境里是否安装了command line developer tools 打开Terminal终端 输入g 提示 xcrun error invalid acti
  • (新)Chrome浏览器自定义背景插件

    一 效果预览 二 项目回顾 1 原理 主要是利用js脚本在页面打开前插入一个背景图片容器 在通过相应的事件控制来实现该功能 2 功能 将网络图片设置为浏览器背景 3 使用 下载插件 gt 修改js文件 加入图片链接 添加浏览器扩展 gt 刷
  • C++学习记录6--srand(time(NULL)产生随机数

    time 函数 返回从1970 1 1 00 00 00到调用time 函数时所经过的时间 以秒为单位 所以是个整数 time NULL 或time 0 表示在内存中不存储返回的数值 头文件 include
  • 如何保证测试用例覆盖全面

    测试用例覆盖度一般是从以下几方面衡量的 1 测试需求的覆盖 保证所有需求都已经设计用例 2 测试特性的覆盖 保证所有不同类型已覆盖 如 功能测试 性能测试等 3 平台与层次的覆盖 保证所有平台有用例覆盖 不同层次都有设计用例 如业务层 接口
  • JavaScript随机生成颜色功能

    思路 实现一个函数 随机生成颜色 格式为 000000 颜色由a f A F 0 9 3种字母任意组成 且 后面是3位或者6位 只要随机生成一个数字是奇数或者偶数来随机出是3位或者6位 然后在随机其下标循环上面步骤确认的次数 functio
  • 设计模式之简单工厂模式(Simply Factory)摘录

    从设计模式的类型上来说 简单工厂模式是属于创建型模式 又叫静态工厂方法 Static Factory Method 模式 但不属于23种GOF设计模式之一 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 简单工厂模式是工厂模式家族