Qter 发表于 2022-11-11 16:08:54

C++设计模式——简单工厂模式

本帖最后由 Qter 于 2022-11-11 16:10 编辑

https://blog.csdn.net/caoshangpa/category_6452246.html
https://blog.csdn.net/caoshangpa/article/details/52763923
问题描述之前在公司做了一个windows 8平台的阅读器。首先,需要将电子书中的内容渲染到屏幕上,而电子书每一页都包含各种各样的内容,比如:图形、图像和文字等等;不同的内容,就是不同的对象;在将不同的内容渲染到屏幕上之前,就需要new操作,建立不同的对象,然后再在屏幕上进行描绘。这个时候,就需要进行很多new操作,new操作分布在代码的不同地方,管理起来很麻烦,而且也很乱,到后期扩展和维护的时候,有的时候,对象多的让开发人员不知道这个对象是干什么的,这就增加了难度;同时,new操作,都会有对应的异常处理,最后,就会发现,在代码中,new了一个对象,然后,就跟着一段异常处理代码,这时编码变的极其混乱和臃肿。那么怎么办?怎么办?此时,我们需要一个新的类,专门从事对象的建立和释放,之后,对象的各种操作,和这个类没有任何关系。这个专门建立对象的类,向外暴漏创建对象的接口,供外部调用。工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。UML类图对于工厂模式,具体上可以分为三类:
[*]简单工厂模式;
[*]工厂方法模式;
[*]抽象工厂模式。
对于上面的三种工厂模式,从上到下逐步抽象,并且更具一般性。而这篇博文主要讲的是简单工厂模式,后两种会在之后的博文中接着总结。
https://img-blog.csdn.net/20161009101715200
ProductA、ProductB和ProductC继承自Product虚拟类,Show方法是不同产品的自描述;Factory依赖于ProductA、ProductB和ProductC,Factory根据不同的条件创建不同的Product对象。适用场合
[*]在程序中,需要创建的对象很多,导致对象的new操作多且杂时,需要使用简单工厂模式;
[*]由于对象的创建过程是我们不需要去关心的,而我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,如此,方便后期的程序扩展和维护。
代码实现/*
** FileName   : SimpleFactoryPatternDemo
** Author       : Jelly Young
** Date         : 2013/11/17
** Description: More information, please go to http://www.jellythink.com
*/

#include <iostream>
#include <vector>
using namespace std;

typedef enum ProductTypeTag
{
      TypeA,
      TypeB,
      TypeC
}PRODUCTTYPE;

// Here is the product class
class Product
{
public:
      virtual void Show() = 0;
};

class ProductA : public Product
{
public:
      void Show()
      {
                cout<<"I'm ProductA"<<endl;
      }
};

class ProductB : public Product
{
public:
      void Show()
      {
                cout<<"I'm ProductB"<<endl;
      }
};

class ProductC : public Product
{
public:
      void Show()
      {
                cout<<"I'm ProductC"<<endl;
      }
};

// Here is the Factory class
class Factory
{
public:
      Product* CreateProduct(PRODUCTTYPE type)
      {
                switch (type)
                {
                case TypeA:
                        return new ProductA();

                case TypeB:
                        return new ProductB();

                case TypeC:
                        return new ProductC();

                default:
                        return NULL;
                }
      }
};

int main(int argc, char *argv[])
{
      // First, create a factory object
      Factory *ProductFactory = new Factory();
      Product *productObjA = ProductFactory->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;
}

Qter 发表于 2023-4-14 09:28:21


[*]软件设计七大原则
对扩展开发,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改关闭,意味着类一旦设计完成,就可以独立的工作,而不要对其进行任何的修改。在面向对象设计中,我们通常通过继承和多态来实现OCP,即封装不变部分。比如需求要实现2种状态的业务。☆如果用if else来判断,那么后面加第三种状态,就还需要在此接口上增加else逻辑,不符合开闭原则。☆用策略类实现,则定义策略接口,策略A和策略B为具体实现类,分别对应两种状态。
原创 2016-11-17 16:33:11· 1781 阅读· 0 评论

[*]C++设计模式——享元模式
前言无聊的时候,也去QQ游戏大厅玩五子棋或者象棋;作为程序员,看到一个产品,总要去想想它是怎么设计的,怎么完成的,我想这个是所有程序员都会做的事情吧(强迫症???)。有的时候,想完了,还要做一个DEMO出来,才能体现自己的NB,然后还有点小成就感。在玩五子棋或象棋的时候,我就想过,腾讯那帮伙计是怎么做的呢?五子棋的棋子有黑白两色,难道每次放一个棋子就new一个对象么?象棋有车、马、
转载 2016-10-17 10:52:53· 538 阅读· 2 评论

[*]C++设计模式——外观模式
前言在实际开发时,面对一个大的系统,总是会将一个大的系统分成若干个子系统,等子系统完成之后,再分别调用对应的子系统来完成对应的整体功能,这样有利于降低系统的复杂性;最终进行实现某个具体的功能时,我们将对应的子系统进行组合就好了;但是,子系统那么多,关系那么复杂,组合形成一个完整的系统,是存在难度的。我们在使用visual studio进行编译C++代码时,你只是在菜单中选择了Bui
转载 2016-10-17 10:03:41· 457 阅读· 0 评论

[*]C++设计模式——代理模式
前言青春总是那样,逝去了才开始回味;大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光。大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了;还好,后来搞了一个游戏代理,总算能勉勉强强的玩了两年。时至今日,敲起键盘写设计模式的时候,又想起了那些美好的时光。好了,这是一篇技术文章,而不是抒情怀旧的散文;思绪再回到这篇文章上来,游戏代理,是个什么东西,有了
转载 2016-10-17 11:23:43· 494 阅读· 0 评论

[*]C++设计模式——中介者模式
前言我们都知道,这个国际政治是一门很深的学问,不玩政治的人是搞不懂的。那么多的国家,国家之间的关系又及其复杂;就好比现在,美国和中国有经济利益关系,美国又和日本有盟友关系,朝鲜又和中国有说不清道不明的关系;这些复杂的关系,稍微处理不好,就可能引发局部战争,更有可能引发第三次世界大战。如果出现了国与国之间出现了利益纠纷,那么该怎么办呢?这个时候,联合国出现了。联合国就是一个处理国与国之间纠纷
转载 2016-10-28 14:08:15· 601 阅读· 0 评论

[*]C++设计模式——备忘录模式
前言又到年底了,也静不下心来写代码了,大家都很浮躁;翻出经典的《仙剑奇侠传》玩一会;又要打大BOSS,先存一下档吧。这是我的习惯,在打大BOSS之前,都要先存一下档,要是打赢了,就再存一个档,覆盖之前的;如果打输了,就恢复之前的存档,接着重来。我想大家都是这么玩的吧。哎呀,总是打不过。好了,不玩了,但是,游戏中的那个存档行为却让我很着迷,它是如何实现的呢?带着好奇的心,去百度了一下;哦,原
转载 2016-10-28 14:35:19· 2701 阅读· 0 评论

[*]C++设计模式——观察者模式
前言之前做了一个性能测试的项目,就是需要对现在的产品进行性能测试,获得测试数据,然后书写测试报告,并提出合理化的改善意见。项目很简单,我们获得了一系列性能测试数据,对于数据,我们需要在Excel中制作测试数据的折线图、饼状图和柱状图,以直观的表现出性能的变化。在实际操作时,我发现,如果我修改了一个数据,折线图、饼状图和柱状图就都发生了变换。这个是如何做到的?这就要说到今天总结的观察者模式了
转载 2016-10-28 15:02:40· 483 阅读· 0 评论

[*]C++设计模式——状态模式
前言在实际开发中,我们经常会遇到这种情况;一个对象有多种状态,在每一个状态下,都会有不同的行为。那么在代码中我们经常是这样实现的。typedef enum tagState{ state, state1, state2}State;void Action(State actionState){ if (actionState == st
转载 2016-10-30 11:46:01· 1126 阅读· 0 评论

[*]C++设计模式——策略模式
前言刚刚加班回来;哎,公司规定平时加班只有10块钱的餐补;星期六和星期天加班,只给串休假;在国家规定的节假日按照3倍工资发放。那么对于这么多的计算加班费的方法,公司的OA系统是如何进行做的呢?这就要说到今天我这里总结的策略设计模式了。策略模式在GOF的《设计模式:可复用面向对象软件的基础》一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替
转载 2016-10-30 12:55:57· 560 阅读· 1 评论

[*]C++设计模式——访问者模式
前言这是23+1(简单工厂模式)之中的最后一个了——访问者模式。访问者模式也是一个比较麻烦的设计模式。我也没有实战经验,对于访问者模式的理解完全来自GOF的《设计模式:可复用面向对象软件的基础》,而这篇文章就是根据对这本书的理解而写出来的。在读《设计模式:可复用面向对象软件的基础》的时候,让我想起自己做过的一个项目,该项目虽然没有使用访问者模式,但是,今天理解了该模式,如果使用该模式对之前
转载 2016-10-30 13:08:07· 561 阅读· 0 评论

[*]C++设计模式——模板方法模式
前言离开了自己工作了将近两年的公司,日子不再有了忙碌,可以闲下来,躺在家里的床上,想着以后的路怎么走,说实话,真的很迷茫,从2012年毕业到现在,时间不长,但是学到的东西真的是非常有限,一直从事于Windows平台上的开发。说到Windows平台的开发,大家都肯定知道的HOOK的,即使不知道HOOK,对于COM应该也是知道的,我的系列博文中也对COM进行过全面的总结。说白了,HOOK就是在
转载 2016-10-30 13:11:55· 1771 阅读· 0 评论

[*]C++设计模式——装饰模式
前言在实际开发时,你有没有碰到过这种问题;开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作;而有一些非核心的操作,可能会使用,也可能不会使用;现在该怎么办呢?将这些非核心的操作全部放到类中,这样,一个类就包含了很多核心的操作和一些看似有关,但是又无关的操作;这就会使核心类发生“爆炸”的现象,从而使核心类失去了一定的价值,也使使用核心类的客户在核心操
转载 2016-10-14 23:23:12· 609 阅读· 0 评论

[*]C++设计模式——组合模式
问题描述上图,是一个公司的组织结构图,总部下面有多个子公司,同时总部也有各个部门,子公司下面有多个部门。如果对这样的公司开发一个OA系统,作为程序员的你,如何设计这个OA系统呢?先不说如何设计实现,接着往下看,看完了下面的内容,再回过头来想怎么设计这样的OA系统。什么是组合模式?在GOF的《设计模式:可复用面向对象软件的基础》一书中对组合模式是这样说的:将对象组
转载 2016-10-14 22:30:30· 487 阅读· 0 评论

[*]C++设计模式——迭代器模式
前言又到年底了,时间真的过的好快啊。最近也非常感伤,总是怀念大学的日子,做梦的时候也常常梦到。梦到大学在电脑前傻傻的敲着键盘,写着代码,对付着数据结构与算法的作业;建立一个链表,遍历链表,打印链表。现在把那个时候声明的链表的头文件拿出来看看:typedef struct tagNode{ int value; tagNode *pPre; tagNode
转载 2016-10-24 16:11:02· 1093 阅读· 0 评论

[*]C++设计模式——抽象工厂模式
问题描述之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理;由于工厂方法模式创建的对象都是继承于Product的,所以工厂方法模式中,每个工厂只能创建单一种类的产品,当需要生产一种全新的产品(不继承自Product)时,发现工厂方法是心有余而力不足。举个例子来说:一个显示器电路板厂商,旗下的
转载 2016-10-10 11:48:02· 526 阅读· 0 评论

[*]C++设计模式——工厂方法模式
之前讲到了C++设计模式——简单工厂模式,由于简单工厂模式的局限性,比如:工厂现在能生产ProductA、ProductB和ProductC三种产品了,此时,需要增加生产ProductD产品;那么,首先是不是需要在产品枚举类型中添加新的产品类型标识,然后,修改Factory类中的switch结构代码。是的,这种对代码的修改,对原有代码的改动量较大,易产生编码上的错误(虽然很简单,如果工程大了,出错
转载 2016-10-10 11:40:47· 500 阅读· 0 评论

[*]C++设计模式——单例模式
问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志。那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,写完日志,再delete,不要告诉我你是这么干的。在C++中,可以构造一个日志模块的全局变量,那么在任何地方就都可
转载 2016-10-11 11:52:50· 594 阅读· 0 评论

[*]C++设计模式——建造者模式
建造者模式在GOF的《设计模式 可复用面向对象软件的基础》中是这样说的:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这句话,似懂非懂的。一个复杂对象的创建,其通常是由很多的子对象构成;如果一个对象能够直接就创建好了,那么也不会称之为复杂对象。由于项目中需求的变化,这个复杂对象的各个部分经常会发生剧烈的变化,但是,不管怎么变化,将它们组合在一起,组成一个
转载 2016-10-12 12:58:28· 490 阅读· 0 评论

[*]C++设计模式——原型模式
什么是原型模式?在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这这个定义中,最重要的一个词是“拷贝”,也就是口头上的复制,而这个拷贝,也就是原型模式的精髓所在。举一个最简单的例子来说明原型模式:记得上小学的时候,老师把需要做的课外习题写到黑板上,而下面的我们都要把这些题抄写到自己的本子上,回家做好,第二
转载 2016-10-12 13:04:03· 447 阅读· 0 评论

[*]C++设计模式——适配器模式
生活中的适配器买笔记本电脑,买手机时,都有一个电源适配器,电源适配器又叫外置电源,是小型便携式电子设备及电子电器的供电电压变换设备,常见于手机,笔记本电脑上。它的作用是将家里的220V高电压转换成这些电子产品能工作的5V~20V左右稳定的低电压,使它们能正常工作。就是说,如果没有这个电源适配器,我们的手机和电脑就不能进行充电了。之前同事去日本出差,由于工作需要,就将自己的笔记本带过
转载 2016-10-12 13:11:25· 629 阅读· 0 评论

[*]C++设计模式——桥接模式
问题描述现在要去画一个图形,图形有长方形、圆形和扇形等等;而图形又可以加上不同的颜色,然后,我们就可以画出红色的长方形,绿色的长方形;红色的圆形,绿色的圆形等等。而这种图形的形状在变化,图形的颜色也在变化,当使用代码去实现时,如何面对这种多方面的变化呢?这就要说到今天的桥接模式了。什么是桥接模式?对于上述的图形与颜色的问题时,很多时候,我们让各个图形类继承颜色类,比如:
转载 2016-10-12 13:15:27· 472 阅读· 0 评论

[*]C++设计模式——职责链模式
前言最近心情很差,因为生活,因为工作;所以想请几天假去丽江玩玩。就向项目经理提交了休假申请,我的项目经理向项目主管提交了我的休假申请,项目主管向部门经理提交了我的休假申请;最后,部门经理同意了我的休假申请。是的,一个简单的休假申请,需要这么复杂的流程,这也是一个公司保证它正常运行的必要。如果部门经理休假了,那么我的休假申请由谁审批呢?这个时候由项目主管代替部门经理进行审批。一个休假申请的审
转载 2016-10-24 15:13:42· 424 阅读· 0 评论

[*]C++设计模式——解释器模式
前言那日,闲的无聊,上了一个在线编程学习网站;最近那个在线编程学习网站很火啊;之前,盖茨、扎克伯格等大人物都来宣传了,思想是人人都应该学习编程;我一想就这算怎么回事啊?这要是在中国,还让人活不?话题不扯开了,还是说我上了那个在线编程网站吧,首先是给你玩一个小游戏,激发你对编程的兴趣。游戏是这样的,网页上有一个编辑框,屏幕上有一只小狗,比如你在编辑框中输入这样的句子:down run 10;
转载 2016-10-24 15:54:32· 981 阅读· 0 评论

[*]C++设计模式——命令模式
前言又要过年了,又是一个抢票季;从大学起,到现在工作,一直都是在外地,离家千里;以前买票,曾经也去火车站通宵排队买票;直到12306的腾空出现,在电脑前不停止的点着鼠标刷票,那个时候12306很是脆弱,抢一张票更是难上加难;现在好了,慢慢强大的12306,买票时出现了一个排队系统,先买票,进入12306的排队系统;然后,系统一个一个的处理大家的请求,一旦你的购票请求进入了排队系统,你就无法
转载 2016-10-24 15:50:09· 1059 阅读· 0 评论

[*]C++设计模式——简单工厂模式
问题描述之前在公司做了一个windows 8平台的阅读器。首先,需要将电子书中的内容渲染到屏幕上,而电子书每一页都包含各种各样的内容,比如:图形、图像和文字等等;不同的内容,就是不同的对象;在将不同的内容渲染到屏幕上之前,就需要new操作,建立不同的对象,然后再在屏幕上进行描绘。这个


页: [1]
查看完整版本: C++设计模式——简单工厂模式