02.工厂模式--Factory
模式 -- 02 工厂 Factory
2023-09-14 09:16:31 时间
原文地址: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;
}
如上源码所示,如果再需要增加其他运算,只需要添加对应的运算子类的代码(其他运算类的细节不需要让修改者知道),然后修改运算类工厂。
相关文章
- 新视野 | 新基建的内涵与模式
- 自动化测试框架[Cypress PO模式]
- 命令模式一
- AQS源码剖析第三篇--共享模式
- 【流量代理】代理模式「建议收藏」
- 一起学习设计模式--04.抽象工厂模式
- 结构型模式--设计模式详解?
- 模式生物,鸡--不止于大餐,还可用于基因编辑!- MedChemExpress
- 面向对象设计模式--单例模式详解+实际应用(Java)
- 面向对象设计模式--原型模式详解+实际应用(Java)
- 打破单片机开发模式--胶水语言(JavaScript)
- 文本向量化的六种常见模式
- SpringBoot2.0之整合ActiveMQ(点对点模式)详解编程语言
- 如何快速退出Linux单用户模式(linux单用户模式退出)
- Red Hat CEO宣布公司将从客户端-服务器模式转型至云计算
- 新型恶意程序 Snatch 曝光:进入安全模式加密数据向受害者勒索比特币
- 互联网医疗的“郑州模式”:10家公立医院、760家定点药店和受益的960多万参保人
- 如何正确设置MSSQL模式(怎么设置mssql模式)
- 代理模式之Java动态代理实现方法