在我们要使用一个对象时,就必须通过类来实例化对象,也就是需要new一个对象。在new的过程是非常复杂的,要经过读文件->解析文本->创建对象->给属性设值等过程。而引入工厂模式,就是将创建类的这个步骤又工厂来帮我们完成,我们只需要去使用工厂里创建好的类即可。在使用工厂时,我们需要让工厂知道我们想要的一个对象,所以我们可以通过传参的方式去告诉工厂我们的需求

定义思想:在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类

优点

  1. 实现了客户端和具体实现类的解耦
  2. 客户端免除了直接创建产品对象的责任,而仅仅“消费”产品产品
  3. 客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可

缺点

  1. 想要增加新的产品类时需要修改源代码,不符合开闭原则
  2. 工厂类中集中了所有产品类的创建逻辑,如果这个类发生了问题。整个系统都要受到影响

适用场景

  1. 工厂类负责创建的对象比较少
  2. 客户端只知道传入工厂类的参数,对于如何创建对象不关心:

由于简单工厂模式不符合开闭原则,所以大佬将该模式从24种设计模式中移除

代码实现(手机产品)

首先创建一个抽象手机类,指定具体产品手机必须具有指定功能,也就是产品类必须要重写该类中的方法

//抽象手机
class AbstractPhone
{public:virtual void ShowName() = 0;
};

具体产品的手机继承抽象手机类并对其方法进行重写

//华为
class Huawei : public AbstractPhone
{public:virtual void ShowName(){cout << "Huawe Phone" << endl;}
};//小米
class Xiaomi : public AbstractPhone
{public:virtual void ShowName(){cout << "Xiaomi Phone" << endl;}
};//苹果
class Apple : public AbstractPhone
{public:virtual void ShowName(){cout << "Apple Phone" << endl;}
};

通过传入的参数来确定需要生成哪种手机

//手机工厂
class PhoneFactory
{public:static AbstractPhone* CreatePhone(string name){if (name == "huawei")//...生产细节return new Huawei;else if (name == "xiaomi")//...生产细节return new Xiaomi;else if (name == "apple")//...生产细节return new Apple;elsereturn nullptr;}
};

测试:

void test()
{//创建工厂PhoneFactory* factor = new PhoneFactory;//创建手机AbstractPhone* phone;//指定工厂需要创建的手机phone = factor->CreatePhone("huawei");phone->ShowName();delete phone;phone = factor->CreatePhone("xiaomi");phone->ShowName();delete phone;phone = factor->CreatePhone("apple");phone->ShowName();delete phone;delete factor;
}

运行截图

推荐阅读设计模式 C++工厂方法模式

设计模式 C++简单工厂模式相关推荐

  1. php的类图怎么生成_PHP设计模式之简单工厂模式

    PHP设计模式之简单工厂模式 先从简单工厂入门,不管是面试还是被他人面试,在问到设计模式的时候,大多数人都会提到工厂模式.毫无疑问,工厂相关的几种模式在设计模式中是最出名的也是应用比较广泛的一种模式. ...

  2. C#设计模式(2)——简单工厂模式

    一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式--简单工厂模式. 二.简单工厂 ...

  3. 工厂模式 java场景_研磨设计模式之简单工厂模式(场景问题)

    简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧.为了保持一致性,我们尽量按照学习其它模式的步骤来进行学习. 1  场景问题 ...

  4. .NET设计模式(1): 简单工厂模式

    .NET设计模式(1): 简单工厂模式 最近一直在看设计模式,想把自己的学习笔记与大家分享一下,如果能帮助大家的话,我会非常高兴,同时也欢迎大家指出里面的不足.园子里其实关于此类文章已经很多了,如果d ...

  5. JS常用的设计模式(2)——简单工厂模式

    JS常用的设计模式(2)--简单工厂模式 简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定 ...

  6. 设计模式之简单工厂模式(C#版)

    设计模式之简单工厂模式(C#版) 简介 假设有个女朋友 总结 简介 我用最简洁而直接的方式来描述一下,什么是简单工厂模式.一句话就是,工厂类使用switch case语句返回特定类型. 下面,我们用一 ...

  7. 大牧絮叨设计模式:简单工厂模式

    文章目录 1. 简单工厂模式概述 1.1.简单工厂模式核心组件 1.2.简单工厂模式优缺点 2.` Java`实现 公共父类定义 产品具体实现类 简单工厂定义 代码运行测试: 3. `Python`实 ...

  8. 设计模式之简单工厂模式(Java 实现)

    设计模式之简单工厂模式(Java 实现) 本文首发于http://www.imooc.com/wiki/Designlesson/factory.html 简单工厂模式是平时开发过程中最常见的设计模式 ...

  9. 设计模式之简单工厂模式

    一.概述 工厂模式具体包括了简单工厂.工厂方法.抽象工厂,它们是按照从简单到复杂的顺序排列的,属于设计模式中的创建型,其中简单工厂并不属于GOF的23中模式.   但是它是理解其它的工厂模式的一个很好 ...

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

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

最新文章

  1. AutoIt脚本在做自动化操作的时候,如何进行错误捕获?
  2. Hyper-V 3 虚拟机快照之四 导入/导出快照
  3. QQ被曝自动读取浏览器记录,Chrome、Edge和360等无一幸免
  4. 机器学习算法基础——朴素贝叶斯算法
  5. 计算机二级基础知识 文库,计算机二级公共基础知识(全)
  6. Gradle 工具的源码研究
  7. 室内定位系列 ——WiFi位置指纹(译)
  8. leetcode1085. 最小元素各数位之和 py不止是字符串的神!
  9. 蓝牙技术谈之跳频技术(一)
  10. oracle 数据页,常见数据库分页实现方案-Oracle
  11. 柱状图柱子上面显示数字
  12. html5移动端选择城市,移动端城市选择插件(原创)
  13. 系统维护模式修改/etc/fstab
  14. 机械制图及计算机绘图试题库,机械制图及计算机绘图--试题库2016版.pdf
  15. matlab如何求反渐开线函数,inv函数(inv函数查询表)
  16. Wc2015……酱油记?
  17. 工作流系统之四十二 业务规则和业务过程
  18. 谷歌创始人年度公开信:搜索仍是谷歌的核心
  19. 【安全】移动端安全评估Checklist
  20. git的pull和push操作

热门文章

  1. java乱码转中文乱码_java字节数组转换中文乱码,请求帮助
  2. input和button放在同一行_黑龙江作家协会冯殿波散文集《足音》84情系东保卫,魅力采风行...
  3. yum mysql my.ini_Centos7 yum安装mysql
  4. 计算机课玩的小游戏怎么找,能够回味电脑课的小游戏是什么 怎么制作这两个小游戏...
  5. java信号量源代码_Java信号量Semaphore原理及代码实例
  6. 对InputStreamReader 和 OutputStreamWriter的理解
  7. 基于JAVA+SpringBoot+Mybatis+Vue+MYSQL的智慧养老管理系统
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的线上超市管理系统
  9. postman自动打开_postman---postman自动发博客
  10. 安卓线程同步面试_面试BAT大厂,可少不了这些题目!