博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
02.工厂模式--Factory
阅读量:2393 次
发布时间:2019-05-10

本文共 2506 字,大约阅读时间需要 8 分钟。

原文地址:

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

你可能感兴趣的文章
myisampack工具(MyISAM表压缩工具)
查看>>
Oracle的NLS_DATE_FORMAT设置(日期格式设置)
查看>>
如何修改集群的公网信息(包括 VIP) (文档 ID 1674442.1)
查看>>
如何查看端口被哪个进程占用?
查看>>
Oracle表空间的管理方式(LMT、DMT)--本地和字典管理
查看>>
SQL Server常见数据类型介绍
查看>>
Oracle软件权限修复
查看>>
Oracle 12c新特性--ASMFD(ASM Filter Driver)特性
查看>>
Oracle恢复一例--ORA-03113、ORA-24324,ORA-01041错误
查看>>
RMAN的压缩备份
查看>>
Oracle 18c bug 执行 DBMS_PDB.CHECK_PLUG_COMPATIBILITY报错
查看>>
可刷新的PDB(PDB Refresh)
查看>>
oracle 19c使用dgmgrl来执行switchover和failover切换
查看>>
Oracle RAC重新运行root.sh脚本
查看>>
Linux系统ACL权限设置之setfacl和getfacl
查看>>
Oracle 19c rac的搭建
查看>>
【DG】在Linux平台上搭建单实例的dataguard--duplicate
查看>>
MySQL启动和关闭命令总结
查看>>
【DG】Oracle11g异构平台之Linux To Windows DataGuard安装配置--duplicate
查看>>
MySQL环境搭建利器---Sandbox
查看>>