转自:http://blog.csdn.net/wuzhekai1985/article/details/6660462

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍工厂模式的实现。

工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。听上去差不多,都是工厂模式。下面一个个介绍,首先介绍简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。有点抽象,举个例子就明白了。有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核。客户需要什么样的处理器核,一定要显示地告诉生产工厂。下面给出一种实现方案。

[cpp] view plaincopy print?
  1. enum CTYPE {COREA, COREB};
  2. class SingleCore
  3. {
  4. public:
  5. virtual void Show() = 0;
  6. };
  7. //单核A
  8. class SingleCoreA: public SingleCore
  9. {
  10. public:
  11. void Show() { cout<<"SingleCore A"<<endl; }
  12. };
  13. //单核B
  14. class SingleCoreB: public SingleCore
  15. {
  16. public:
  17. void Show() { cout<<"SingleCore B"<<endl; }
  18. };
  19. //唯一的工厂,可以生产两种型号的处理器核,在内部判断
  20. class Factory
  21. {
  22. public:
  23. SingleCore* CreateSingleCore(enum CTYPE ctype)
  24. {
  25. if(ctype == COREA) //工厂内部判断
  26. return new SingleCoreA(); //生产核A
  27. else if(ctype == COREB)
  28. return new SingleCoreB(); //生产核B
  29. else
  30. return NULL;
  31. }
  32. };

这样设计的主要缺点之前也提到过,就是要增加新的核类型时,就需要修改工厂类。这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。于是,工厂方法模式出现了。所谓工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

听起来很抽象,还是以刚才的例子解释。这家生产处理器核的产家赚了不少钱,于是决定再开设一个工厂专门用来生产B型号的单核,而原来的工厂专门用来生产A型号的单核。这时,客户要做的是找好工厂,比如要A型号的核,就找A工厂要;否则找B工厂要,不再需要告诉工厂具体要什么型号的处理器核了。下面给出一个实现方案。

[cpp] view plaincopy print?
  1. class SingleCore
  2. {
  3. public:
  4. virtual void Show() = 0;
  5. };
  6. //单核A
  7. class SingleCoreA: public SingleCore
  8. {
  9. public:
  10. void Show() { cout<<"SingleCore A"<<endl; }
  11. };
  12. //单核B
  13. class SingleCoreB: public SingleCore
  14. {
  15. public:
  16. void Show() { cout<<"SingleCore B"<<endl; }
  17. };
  18. class Factory
  19. {
  20. public:
  21. virtual SingleCore* CreateSingleCore() = 0;
  22. };
  23. //生产A核的工厂
  24. class FactoryA: public Factory
  25. {
  26. public:
  27. SingleCoreA* CreateSingleCore() { return new SingleCoreA; }
  28. };
  29. //生产B核的工厂
  30. class FactoryB: public Factory
  31. {
  32. public:
  33. SingleCoreB* CreateSingleCore() { return new SingleCoreB; }
  34. };

工厂方法模式也有缺点,每增加一种产品,就需要增加一个对象的工厂。如果这家公司发展迅速,推出了很多新的处理器核,那么就要开设相应的新工厂。在C++实现中,就是要定义一个个的工厂类。显然,相比简单工厂模式,工厂方法模式需要更多的类定义。

既然有了简单工厂模式和工厂方法模式,为什么还要有抽象工厂模式呢?它到底有什么作用呢?还是举这个例子,这家公司的技术不断进步,不仅可以生产单核处理器,也能生产多核处理器。现在简单工厂模式和工厂方法模式都鞭长莫及。抽象工厂模式登场了。它的定义为提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。具体这样应用,这家公司还是开设两个工厂,一个专门用来生产A型号的单核多核处理器,而另一个工厂专门用来生产B型号的单核多核处理器,下面给出实现的代码。

[cpp] view plaincopy print?
  1. //单核
  2. class SingleCore
  3. {
  4. public:
  5. virtual void Show() = 0;
  6. };
  7. class SingleCoreA: public SingleCore
  8. {
  9. public:
  10. void Show() { cout<<"Single Core A"<<endl; }
  11. };
  12. class SingleCoreB :public SingleCore
  13. {
  14. public:
  15. void Show() { cout<<"Single Core B"<<endl; }
  16. };
  17. //多核
  18. class MultiCore
  19. {
  20. public:
  21. virtual void Show() = 0;
  22. };
  23. class MultiCoreA : public MultiCore
  24. {
  25. public:
  26. void Show() { cout<<"Multi Core A"<<endl; }
  27. };
  28. class MultiCoreB : public MultiCore
  29. {
  30. public:
  31. void Show() { cout<<"Multi Core B"<<endl; }
  32. };
  33. //工厂
  34. class CoreFactory
  35. {
  36. public:
  37. virtual SingleCore* CreateSingleCore() = 0;
  38. virtual MultiCore* CreateMultiCore() = 0;
  39. };
  40. //工厂A,专门用来生产A型号的处理器
  41. class FactoryA :public CoreFactory
  42. {
  43. public:
  44. SingleCore* CreateSingleCore() { return new SingleCoreA(); }
  45. MultiCore* CreateMultiCore() { return new MultiCoreA(); }
  46. };
  47. //工厂B,专门用来生产B型号的处理器
  48. class FactoryB : public CoreFactory
  49. {
  50. public:
  51. SingleCore* CreateSingleCore() { return new SingleCoreB(); }
  52. MultiCore* CreateMultiCore() { return new MultiCoreB(); }
  53. };

至此,工厂模式介绍完了。利用Rational Rose 2003软件,给出三种工厂模式的UML图,加深印象。

简单工厂模式的UML图:

工厂方法的UML图:

抽象工厂模式的UML图:

设计模式C++实现(1)——工厂模式相关推荐

  1. 设计模式C#描述——抽象工厂模式

    设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产 ...

  2. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  3. 设计模式(五)--工厂模式汇总

    LZ想把简单工厂模式.工厂方法模式和抽象工厂模式整理到一篇博文当中,由浅入深,应该能方便理解和记忆,话不多说,进入正题. 一.简单工厂模式 定义:从设计模式的类型上来说,简单工厂模式是属于创建型模式, ...

  4. 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...

    转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...

  5. 23种设计模式 -----Day01:简单工厂模式

    目录 前言 1.设计模式(Design pattern)定义 2.为什么要使用设计模式(使用设计模式的意义) 3.设计原则 a.单一职责原则 b.开放封闭原则 c.里氏代换原则 d.迪米特法则 e.依 ...

  6. 一口气讲完设计模式(单例模式、工厂模式、原型模式、建造者模式、适配器、桥梁模式)

    设计模式 使用设计模式,可以让我们的代码具有更好的可读性.可扩展性.可读性.重用性.符合高内聚低耦合的特点.作为程序员,是我们经常听到的概念,也是我们程序员必须深入学习,了解的知识. 设计模式种类 该 ...

  7. 设计模式之创建型——工厂模式(3种)

    →23种设计模式大纲 三种工厂模式 →23种设计模式大纲 定义 分类 1)简单工厂 UML类图 2)工厂方法 UML类图 3)抽象工厂 UML类图 总结 定义 将创建对象这一复杂的过程交由工厂控制,通 ...

  8. 【23种设计模式专题】二 工厂模式

    程序猿学社的GitHub,欢迎Star github技术专题 本文已记录到github 文章目录 前言 小故事 传统方式 简单工厂(第一种) 工厂方法模式(第二种) 抽象工厂模式(第三种) 使用工厂方 ...

  9. 设计模式 笔记4 | 简单工厂模式 在源码中的应用 | Calendar 日历 | 源码浅析 | 使用总结 | 建造者模式

    文章目录 一.Calendar 日历类 1.1 内部属性 1.2 设置时间属性值 1.3 获取时间属性 1.4 使用 Calander 计算时间 二.Calender 类中的设计模式 2.1 简单工厂 ...

  10. 设计模式二、抽象工厂模式

    设计模式part2 1.     抽象工厂模式 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题, ...

最新文章

  1. ubuntu 14.04 vim install youcompleteme
  2. 软件定义网络 对我们有多重要?
  3. MCSE2003学习之六
  4. openstack——horizon篇
  5. BeautifulSoup中的.text方法和get_text()方法的区别
  6. linux系统下卷组管理,Linux LVM卷组管理
  7. 路由表,路由,路由规则_路由和路由表简介
  8. 一个机房的所有计算机联成的网络应是,根据分布范围,一个机房的所有计算机联成的网络应是( )。...
  9. 自定义自己的博客园博客首页
  10. Go语言_array,slice,map
  11. win10家庭中文版安装win7虚拟机
  12. 排版怎么排?八大技巧提升版面设计感
  13. Altium Designer中mm/mil单位切换
  14. 敏感信息泄露漏洞实战
  15. 计算机用户删除文件找回,电脑回收站清空删除的文件该怎么找回
  16. Android获取经纬度以及地址信息
  17. Rabbitmq 安全账号管理方案
  18. Android版本自带游戏,植物大战僵尸自带花园版
  19. linux rsh通信实现_RSH的网络通信细节
  20. 番茄钟怎么调_番茄钟的使用方法与使用体会

热门文章

  1. Interview:算法岗位面试—10.12上午—上海某科技公司图像算法岗位(偏图像算法,互联网AI行业)技术面试考点之LoR逻辑回归的底层代码实现、特征图计算公式
  2. 成功解决OpenCV Error: Assertion failed (ssize.width 0 ssize.height 0) in cv::resize, file C:\proj
  3. Ubuntu:Ubuntu下安装Anaconda和Tensorflow的简介、入门、安装流程之详细攻略
  4. Py之PIL:Python的PIL库的简介、安装、使用方法详细攻略
  5. 递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况
  6. 用Python爬虫爬取炉石原画卡牌图片
  7. OpenSession与getCurrentSession的区别
  8. C++学习19 类的多继承
  9. esp32 Flash分区
  10. 浅谈wcscpy_s之用法