当前位置: 首页 > 编程日记 > 正文

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

从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(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;}/*resultCOperation constructorCAddOperation constructor12CAddOperation destructorCOperation destructorCOperation constructorCSubOperation constructor8CSubOperation destructorCOperation destructorCOperation constructorCMulOperation constructor20CMulOperation destructorCOperation destructorCOperation constructorCDivOperation constructor5CDivOperation destructorCOperation 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

相关文章:

别得意,你只是假装收藏了而已

今天分享我在看罗振宇的《2018 时间的朋友》演讲视频记下的一些思考。跨年演讲中有过这样的一个来自印象笔记的片段&#xff0c;列举了几组对比来说明&#xff1a; 『你在朋友圈里又佛又丧&#xff0c;你在收藏夹里偷偷地积极向上。』 扎心了&#xff0c;这不就是说我吗&#x…

Exchange2003-2010迁移系列之四,配置第一台Exchange CAS/HUB服务器

配置第一台CAS/HUB关于Cas/hub的配置请大家详见前面关于Ex2010的部署&#xff08;两个配置基本相同在这里就不做详细的解说了&#xff09;下面关于Cas的配置在前面已经提到了但是下面是另一种新的方法大家就看看吧生产环境中部署Exchange2010服务器时&#xff0c;是需要按照一定…

设计模式之适配器模式(Adapter)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

JAVA方法中的参数用final来修饰的效果

很多人都说在JAVA中用final来修饰方法参数的原因是防止方法参数在调用时被篡改&#xff0c;其实也就是这个原因&#xff0c;但理解起来可能会有歧义&#xff0c;我们需要注意的是&#xff0c;在final修饰的方法参数中&#xff0c;如果修饰的是基本类型&#xff0c;那么在这个方…

2019世界机器人大赛圆满落幕,荆州中学等15支队伍获「全能奖」

7月28日&#xff0c;2019世界机器人大赛总决赛在河北保定圆满落下帷幕。保定市市委常委罗德强、中国电子学会副秘书长梁靓、保定市政府秘书长王保辉、保定市政府副秘书长安利文、保定市徐水区区长李志永、保定市莲池区政府党组副书记赵建军、世界机器人大赛组委会秘书长李洋、长…

在任何设备上都完美呈现的30个华丽的响应式网站

如今&#xff0c;一个网站只在桌面屏幕上好看是远远不够的&#xff0c;同时也要在平板电脑和智能手机中能够良好呈现。响应式的网站是指它能够适应客户端的屏幕尺寸&#xff0c;自动响应客户端尺寸变化。在这篇文章中&#xff0c;我将向您展示在任何设备上都完美的30个华丽的响…

设计模式之装饰模式(Decorator)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

解决流程自动化“最后一公里问题”,达观数据发布智能 RPA

2019 年7月 26 日&#xff0c;业界领先的人工智能企业达观数据在北京召开“达道至简”为主题的产品发布会&#xff0c;正式推出国内首款自主研发集OCR(光学字符识别)与 NLP(自然语言处理)于一体的达观智能RPA。达观数据创始人兼CEO陈运文、副总裁金克、贾学锋和联合创始人高翔携…

利用脚本生成GUID

实际上&#xff0c;可以使用一种非常简单的方法来生成 GUID&#xff0c;但这种方法近乎像是作弊。&#xff08;您可听清楚了&#xff0c;我们说的可是“近乎”。&#xff09;“Scriptlet.TypeLib”对象的设计用途是帮助您创建“Windows 脚本组件”&#xff08;实质上&#xff0…

设计模式之组合模式(Composite)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

快速开发生命周期支持工具

去年有幸研究公司管理产品的软件平台,当时考虑的产品是基于业务模型之上的一个系统平台,从建模到运行、部署、维护全生命周期管理.当时就提出两个希望先实践解决的就是可复用原型的设计和使用工作流和规则引擎的协作处理询标产品.前一阵子在公司研究成本产品的成本分析和算法,一…

华人学者解开计算机领域30年难题:布尔函数敏感度猜想

整理 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;1992年&#xff0c;布尔函数敏感度猜想&#xff08;Boolean Sensitivity&#xff09;被提出&#xff0c;这成为了理论计算机科学近三十年来最重要、最令人困惑的开放性问题之一。而近日&#xff0c;来自E…

从1.5K到18K 一个程序员的5年成长之路(二)

这一切都来自于心态CSDN&#xff1a;从开始学习&#xff0c;到学有所成和找工作&#xff0c;再到工作中遇到各种困难&#xff0c;然后获得突破&#xff0c;在整个过程中&#xff0c;能总结下你心态都有哪些变化&#xff1f;是用运用什么方法或方式进行调整&#xff1f;雷果国&a…

设计模式之享元模式(Flyweight)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

你想见的大神都来AI ProCon 2019了,优惠票限时抢购开启!

如今 AI 的发展真实地面临着诸多瓶颈、尽管很多智能助手已经可以执行很多任务&#xff0c;但距离真正的人机自然交互还需要很长时间&#xff1b;强人工智能也迟迟未出现&#xff0c;不知何时才能出现&#xff1b;现有的 AI 只能做好一件事&#xff0c;Alpha Go 只会下棋&#x…

qt练习11 鼠标,按键,滚轮事件学习

源代码: http://files.cnblogs.com/hnrainll/event.zip

windows server 2008 R2上安装MRTG指南

一、实验环境 参考教程&#xff1a;http://www.netmon.org/dummies.htm http://www.docin.com/p-158415185.html MRTG中文手册&#xff1a;http://bbs.chinaunix.net/thread-1344687-1-1.html http://www.enterastream.com/whitepapers/mrtg/mrtg-manual-cap9.html 1.硬件平台 …

设计模式之外观模式(Facade)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

知识图谱公开课 | 详解事件抽取与事件图谱构建

现有知识图谱大多关注于以实体为核心的静态知识&#xff0c;缺乏对于以事件为核心的动态知识的刻画和构建。如何从非结构化文本中抽取结构化的事件知识已成为眼下热门研究课题。本次公开课中&#xff0c;我们邀请到了中科院自动化所模式识别国家重点实验室助理研究员陈玉博&…

实时显示系统时间

CTime time;CString m_time;void CtimeDlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码 SetTimer(1,1000,NULL);}void CtimeDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值 timeCTime::GetCurrentTime(); …

安卓手机文件管理器:360°LES文件浏览器

360度LES文件浏览器功能可谓是非常强大&#xff0c;可以对文件或文件夹进行新建、复制、剪切、删除、移动、搜索等操作。支持多标签页&#xff0c;能设置成root级别的管理器, 关联文件打开,列表或图标的形式显示&#xff0c;拖曳文件,多标签页下文件拖曳(下面有详细的讲解)&…

XML DTD 语言学习笔记

-XML DTD 全称&#xff1a;Document Type Definition简介&#xff1a;用于定义文档的合法性。它定义了文档应该有哪些元素及其属性&#xff0c;还有其他一些约束性规则。 注意&#xff1a;DTD语言定义的文档类型是SGML家族的标记性语言。包括SGML,XML,HTML&#xff09;&#xf…

Python快速入门,你想要的就在这里了!

学习Python您是否会面临以下问题&#xff1f;“网上充斥着大量的学习资源、书籍、视频教程和博客&#xff0c;但是大部分都是讲解基础知识&#xff0c;不够深入&#xff1b;也有的比较晦涩&#xff0c;难以理解”CSDN Python学习社群将帮助您过滤网上的垃圾教程资源的技能&…

设计模式之代理模式(Proxy)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

Symfony学习笔记

Symfony学习笔记Symfony本来已经接触过了&#xff0c;可发现好久 不用好多东西都已经遗忘了&#xff0c;决定再次拾起&#xff0c;看能不能发现之前没有注意到的新的东西。果然在不断学习的过程中&#xff0c;又发现了许多自认为很细节但又很重要的地方&#xff0c;下面就列举如…

设计模式之模板方法模式(Template Method)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…

Linux练习(显示环境变量)

#include <stdio.h> #include <stdlib.h> extern char **environ; int main() {char **envenviron;while(*env){printf("%s\n",*env);env;}exit(0); } 主要是environ变量&#xff0c;定义如下 #include <stdlib> extern char **environ;

百度发布ERNIE 2.0,性能超BERT、XLNet

作者 | Khari Johnson 译者 | 赵雪 编辑 | 夕颜 出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 中国科技巨头百度于今日提出了 ERNIE 2.0——一个中英双语的会话式人工智能模型。ERNIE 2.0 在语言理解基准上的表现超过了谷歌的 BERT 和 XLNet&#xff0c;在 9 个国…

php中mkdir()函数的权限问题

为什么80%的码农都做不了架构师&#xff1f;>>> 遇到个问题 某个定时job用root用户mkdir(./test/,0777)新建了目录&#xff0c;指定了权限是0777&#xff0c;结果获得的是0755, 而web上用www用户也在这目录创建目录和文件&#xff0c;结果报错了&#xff0c;一开始…

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给…