原文地址:http://blog.csdn.net/jjunjoe/article/details/6623442

Factory模式:
Factory模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory模式使一个类的实例化延迟到其子类

在面向对象系统设计中经常可以遇到以下的两类问题:
1) 为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。
2) 还有一种情况就是在父类中并不知道具体要实例化哪一个具体的子类。

以上两个问题也就引出了Factory模式的两个最重要的功能:
1)定义创建对象的接口,封装了对象的创建;
2)使得具体化类的工作延迟到了子类中。

Factory模式的问题:
1. 每增加一个具体的Product,Factory就必须对它处理,这样Factory就永远不可能封闭了。
2. Factory模式仅仅局限于一类类(就是说Product是一类,有一个共同的基类),如果我们要为不同类的类提供一个对象创建的接口,那就要用AbstractFactory了。

Factory模式的结构图1:
 

Factory模式的结构图2:
 

以《大话设计模式》中的例子为代表,上面所说的Product就是数学运算。
Factory模式的实现代码:

// Factory.h// 数学运算的基类
class Operator
{
protected:int m_iNumberA;int m_iNumberB;public:virtual int GetResult(){return 0;}void SetOperatorNumber(int iNumberA, int iNumberB){m_iNumberA = iNumberA;m_iNumberB = iNumberB;}
};// 加法
class OperatorAdd : public Operator
{virtual int GetResult(){return m_iNumberA + m_iNumberB;}
};// 减法
class OperatorSub : public Operator
{virtual int GetResult(){return m_iNumberA - m_iNumberB;}
};// 乘法
class OperatorMul : public Operator
{virtual int GetResult(){return m_iNumberA * m_iNumberB;}
};// 除法
class OperatorDiv : public Operator
{virtual int GetResult(){if ( m_iNumberB != 0 ){return m_iNumberA / m_iNumberB;}// 这里要加除数为0异常处理return 0;}
};// 运算的工厂类
class OperatorFactory
{
public:static Operator* CreateOperator(char chOperator){Operator* pOperator = NULL;switch( chOperator ){case '+':pOperator = new OperatorAdd();break;case '-':pOperator = new OperatorSub();break;case '*':pOperator = new OperatorMul();break;case '/':pOperator = new OperatorDiv();break;default:break;}return pOperator;}
};// main.cpp#include <iostream>
using namespace std;
#include "Factory.h"
void main()
{// 对于客户端来说,不需要知道具体的运算类的细节// 加Operator* pOpAdd = OperatorFactory::CreateOperator('+');pOpAdd->SetOperatorNumber(10, 5);cout << pOpAdd->GetResult() << endl;delete pOpAdd;pOpAdd = NULL;// 减Operator* pOpSub = OperatorFactory::CreateOperator('-');pOpSub->SetOperatorNumber(10, 5);cout << pOpSub->GetResult() << endl;delete pOpSub;pOpSub = NULL;// 乘Operator* pOpMul = OperatorFactory::CreateOperator('*');pOpMul->SetOperatorNumber(10, 5);cout << pOpMul->GetResult() << endl;delete pOpMul;pOpMul = NULL;// 除Operator* pOpDiv = OperatorFactory::CreateOperator('/');pOpDiv->SetOperatorNumber(10, 5);cout << pOpDiv->GetResult() << endl;delete pOpDiv;pOpDiv = NULL;
}

如上源码所示,如果再需要增加其他运算,只需要添加对应的运算子类的代码(其他运算类的细节不需要让修改者知道),然后修改运算类工厂。

02.工厂模式--Factory相关推荐

  1. 设计模式(一)工厂模式Factory(创建型)

    设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题. ...

  2. 设计模式(四)——工厂模式(Factory Pattern)

    工厂模式(Factory Pattern) 意义 工厂模式 实现了创建者和调用者的分离.将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性 ...

  3. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  4. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  5. 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。

    设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...

  6. [设计模式]工厂模式factory

    参考:http://wxg6203.iteye.com/blog/740229 简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method ...

  7. 02工厂模式+抽象工厂模式(创建型模式)

    • 工厂模式: – 实现了创建者和调用者的分离. – 详细分类: • 简单工厂模式:用来生产同一等级结构中的任意产品.(对于增加新的产品,需要修改已有代码,虽然某种程度不符合设计原则,但实际使用最多) ...

  8. Java设计模式学习02——工厂模式

    工厂模式 工厂模式主要是为创建对象提供接口,将创建对象的过程隔离起来,实现了创建者与调用者的分离,提高了程序的灵活性.  核心本质: 实例化对象,用工厂方法代替new操作. 将选择实现类.创建对象统一 ...

  9. 一文彻底弄懂工厂模式(Factory)

    文章已收录我的仓库:Java学习笔记与免费书籍分享 模式类型 工厂模式属于创建者模式,与对象的创建有关,其中工厂方法模式用于类,而抽象工厂模式用于对象.创建型类模式将对象的部分创建工作延迟到子类,由子 ...

最新文章

  1. Java2021中级面试题
  2. jfinal mysql增删改查_Jfinal简单实现增删改查
  3. python视频网站项目_Python开发教育网站项目实例教学(105集视频课程含源码)
  4. 学习笔记02:直播串讲02
  5. Android自定义view之measure、layout、draw三大流程
  6. 简单内网***刺探命令
  7. Linux通过源码编译安装程序;yum和源码安转软件包的区别
  8. WPF ICommandSource Implementations Leak Memory!
  9. k3导入账套_金蝶k3凭证导入导出的操作方法金蝶k3操作指南
  10. dell n5110 触摸板驱动
  11. LINUX上基于ASM的ORACLE11的安装
  12. 致远OA办公网“office控件不可用”及“无注册表类”解决办法
  13. 微信赞赏功能升级设置中的坑
  14. 基于JSP实现医院病历管理系统,程序员如何在工作中自我增值
  15. 联想—拯救者—R9000P触控板无反应
  16. .COMBO勒索病毒解密恢复 .xx4444 勒索病毒数据库恢复 .ALCO勒索病毒解密恢复
  17. Code里面的对立统一
  18. 怎样合理地规划使用电脑硬盘
  19. windows10连接共享打印机显示“0x0000011b”错误的解决方法
  20. ACM/ICPC2016沈阳网络赛(不完全)解题报告

热门文章

  1. 0x27软考|网络工程师经验分享之计算机硬件及项目管理
  2. 计算机网络故障的参考文献,计算机网络故障技术研究
  3. element-ui 自定义弹框,加入图片
  4. 使用Dell EMC SupportAssist Enterprise 来检查DELL服务器硬件故障
  5. 互联网公司的招聘职位需求
  6. IE首页被篡改怎么恢复
  7. qq手机令牌 for android3.3 官方安装版,qq安全中心手机令牌
  8. 常用的1000个UserAgent列表,方便以后使用
  9. 计算机系统盘没用的东西怎么删除,怎么手工删除C盘无用的文件
  10. Java窗体科学计算器源码Java计算器开发源码(课程设计)