在程序中,需要创建的对象很多,导致对象的new操作多且杂时,需要使用工厂模式;

由于对象的创建过程是我们不需要去关心的,而我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,如此,方便后期的程序扩展和维护。

工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。

对于工厂模式,具体上可以分为三类:

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

工厂方法模式(factory method pattern):定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。

抽象工厂模式(Abstract factory pattern):提供一个接口, 用于创建相关或依赖对象的家族,而不需要指定具体类。

对于上面的三种工厂模式,从上到下逐步抽象,并且更具一般性。这里讲的是简单工厂模式。

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

1 简单工厂模式适用的场合

1.1 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

1.2 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

如果客户端不知道它所需要的对象的类,可以考虑工厂方法模式。

#include #include using namespace std;typedef enum ProductTypeTag{    TypeA,    TypeB,    TypeC}PRODUCTTYPE;// Here is the product classclass Product{public:    virtual void Show() = 0;};class ProductA : public Product{public:    void Show()    {        cout<CreateProduct(TypeA);    if (productObjA != NULL)        productObjA->Show();    Product *productObjB = ProductFactory->CreateProduct(TypeB);    if (productObjB != NULL)        productObjB->Show();    Product *productObjC = ProductFactory->CreateProduct(TypeC);    if (productObjC != NULL)        productObjC->Show();    delete ProductFactory;    ProductFactory = NULL;    delete productObjA;    productObjA = NULL;    delete productObjB;    productObjB = NULL;            delete productObjC;    productObjC = NULL;    return 0;}

output:

I'm ProductA         I'm ProductB        I'm ProductC 

2 简单工厂模式的优缺点

2.1 优点:

工厂类是整个模式的关键。包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象。

通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。

而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。

2.2 缺点:

由于工厂类集中了所有实例的创建逻辑,违反了开闭原则,将全部创建逻辑集中到了一个工厂类中;

它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.

这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽量让这个类是足够好,写好了就不要去修改了,如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。这个原则有两个特性,一个是说“对于扩展是开放的”,另一个是说“对于更改是封闭的”。面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这就是“开放-封闭原则”的精神所在。

3 总结

创建型模式对类的实例化过程进行了抽象,能够将对象的创建与对象的使用过程分离。简单工厂模式又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。

简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式包含三个角色:工厂角色负责实现创建所有实例的内部逻辑;抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口;具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。简单工厂模式适用情况包括:工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对于如何创建对象不关心。

ref

https://www.cnblogs.com/ring1992/p/9592569.html

https://www.cnblogs.com/xuwendong/p/9634614.html

-end-

设计模式 可复用面向对象软件的基础_面向对象的可复用设计模式之简单工厂模式(1/24)...相关推荐

  1. 《设计模式:可复用面向对象软件的基础》——面向对象设计原则、创建型模式(笔记)

    文章目录 二.面向对象设计原则(补充) 2.1 重新认识面向对象 2.2 面向对象设计原则 2.2.1 依赖倒置原则(DIP) 2.2.2 开放封闭原则(OCP) 2.2.3 单一职责原则(SRP) ...

  2. 设计模式:可复用面向对象软件的基础

    文章目录 设计模式 设计模式有4个基本要素 23个设计模式 设计模式分类 目的准则 范围准则 导致重新设计的一般原因,以及解决这些问题的设计模式举例 设计模式所支持的设计的可变方面 设计模式背后的6大 ...

  3. 好书整理系列之-设计模式:可复用面向对象软件的基础 4

    第4章结构型模式 结构型模式涉及到如何组合类和对象以获得更大的结构.结构型类模式采用继承机制来 组合接口或实现.一个简单的例子是采用多重继承方法将两个以上的类组合成一个类,结果 这个类包含了所有父类的 ...

  4. 《设计模式:可复用面向对象软件的基础》——结构型模式(2)(笔记)

    文章目录 四.结构型模式 4.4 DECORATOR(装饰)--对象结构型模式 1.意图 2.别名 补充部分 3.动机 4.适用性 5.结构 6.参与者 7.协作 8.效果 9.实现 10.代码示例 ...

  5. 《设计模式:可复用面向对象软件的基础》——行为模式(笔记)

    文章目录 五.行为模式 5.1 CHAIN OF RESPONSIBILITY(职责链) 1.意图 2.动机 3.适用性 4.结构 5.参与者 6.协作 7.效果 8.实现 9.代码示例 10.相关模 ...

  6. C++ 设计模式(可复用面向对象软件的基础)学习笔记——第五讲 观察者模式

    对于设计模式初学者来说,GoF的这本设计模式(可复用面向对象软件的基础)是有些难理解的,因此我先看了视频教程,附上教程链接网址https://www.bilibili.com/video/av5225 ...

  7. 《设计模式:可复用面向对象软件的基础》——行为模式(3)(笔记)

    文章目录 五.行为模式 5.9 STRATEGY(策略) 1.意图 2.别名 3.动机 4.适用性 5.结构 6.参与者 7.协作 8.效果 9.实现. 10.代码示例 11.相关模式 5.10 TE ...

  8. 《设计模式:可复用面向对象软件的基础》——创建型模式(2)(笔记)

    文章目录 三.创建型模式 3.4 PROTOTYPE(原型) 1.意图 补充部分 2.动机 3.适用性 4.结构 5.参与者 6.协作 7.效果 8 实现 9.代码示例 10.相关模式 3.5 SIN ...

  9. 《设计模式:可复用面向对象软件的基础》——行为模式(2)(笔记)

    文章目录 五.行为模式 5.5 MEDIATOR(中介者) 1.意图 补充部分 2.动机 3.适用性 4.结构 5.参与者 6.协作 7.效果 8.实现 9.代码示例 10.相关模式 5.6 MEME ...

最新文章

  1. 因为一次 Redis 分布式锁事故,整个项目组被扣绩效了。。。
  2. 人的执念真的是非常的可怕
  3. 试解析Tomcat运行原理(一)--- socket通讯(转)
  4. uva 1152 ——4 Values whose Sum is 0
  5. 微信红包接口 java_【java微信开发】红包接口调用
  6. android bitmap对比,Android Bitmap和Drawable的对比
  7. java 通过 Properties类 读取ini文件 键—值对
  8. Linux下安装并启动MongoDB
  9. 简述计算机的四代发展阶段 以及电子器件,2014计算机作业1答案
  10. SpringBoot+Quartz实现动态可配定时任务(动态定时任务)
  11. 程序员面试:未来五年的规划是怎样的?
  12. Redirected Walking
  13. 读书笔记:大型网站技术架构-核心原理与案例分析
  14. 面试必备:常用的设计模式总结
  15. 【音视频基础】(一):显示器是如何显示图形数据的一
  16. debug protractor
  17. 【Stereo R-CNN 解读】基于立体R-CNN的自动驾驶三维目标检测
  18. 基于GA优化BP神经网络的传感器故障诊断算法matlab仿真
  19. 高通QCC30xx_QCC51xx_如何 DFU升级 OTA升级
  20. 快速傅里叶变换(FFT)

热门文章

  1. DBArtist之Oracle入门第1步: 如何安装Oracle 11g
  2. 关于jacob 无法创建ActiveXCompnent对象的几种可能性
  3. 查找内容grep命令
  4. 分享:mysql分表,分区的区别和联系
  5. 移动互联网“去哪儿”?
  6. 使用Shell遍历目录及其子目录中的所有文件方法
  7. centos7 mysql5.6.34_CentOS7.0环境下MySQL5.6.34安装教程
  8. fcm模糊聚类matlab实例_MATLAB图论实例——最短路径
  9. 【论文写作】课程指导平台的开发中需求分析如何写
  10. 【毕设】ASP.NET基于.NET的城市公交查询系统的设计与实现(源代码+论文)