点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,可以点个在看,让它可以帮助到更多同志
作为一名C++程序员,一些常见的设计模式还是要熟悉的,不然自己都觉得自己像个假程序员!
在看设计模式之前,一直在想这个模式用在什么地方、什么情况下使用?这些问题会随着对设计模式理解的逐渐加深逐渐被解决。
一、直奔主题:
工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。本次只对简单工厂模式说明。
先看基础:
工厂类(Factory): 工厂角色负责实现创建所有实例的内部逻辑。
抽象产品(AbstractProduct):抽象产品角色是所创建的所有对象的父
类,负责描述所有实例所共有的公共接口
具体产品(ConcreteProduct):具体产品角色是创建目标,所有创建的
对象都充当这个角色的某个具体类的实例。
(图片来源网络,侵删)
优点:
①Factory有助于将所有对象创建放在一个地方,并避免将new键值散布在整个代码库中。
②增加新业务时不会对原有业务产生影响
③定义创建对象的接口,封装了对象的创建
缺点:
①对修改不封闭,新增加产品需要修改工厂。违法了开闭法则(OCP)
二、具体程序:
#include <QCoreApplication>
#include <iostream>
#include<stdexcept>
using namespace std;
class Operation
{
public:
Operation():m_numberA(0),m_numberB(0) {}
virtual ~Operation(){};
public:
double getNumberA() {return m_numberA;}
double getNumberB() {return m_numberB;}
void setNumberA( double x){m_numberA = x;}
void setNumberB( double y){m_numberB = y;}
double virtual getResult() {return 0;}
protected:
double m_numberA;
double m_numberB;
};
class Add : public Operation
{
public:
double virtual getResult()
{
return getNumberA() + getNumberB();
}
};
class Sub : public Operation
{
public:
double virtual getResult()
{
return getNumberA() -getNumberB();
}
};
class Mul : public Operation
{
public:
double virtual getResult()
{
return getNumberA() * getNumberB();
}
};
class Div : public Operation
{
public:
double virtual getResult()
{
return getNumberA()/getNumberB();
}
};
class SimpleFactory
{
public:
static Operation *createOperate(char character)
{
Operation *oper = NULL;
switch (character) {
case '+':
oper = new Add();
break;
case '-':
oper = new Mul();
break;
case '*':
oper = new Add();
break;
case '/':
oper = new Div();
break;
default:
break;
}
return oper;
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Operation *oper = NULL;
oper = SimpleFactory::createOperate('+');
oper->setNumberA(1);
oper->setNumberB(1);
double ret = oper->getResult();
std::cout << "operate ret " << ret << "\n";
delete oper;
oper = NULL;
return a.exec();
}
简单工厂模式使用了C++多态性质。
C++多态(polymorphism)是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。
最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,动态绑定。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被称为“虚”函数。
虚函数是C++中用于实现多态的机制。核心理念就是通过基类访问派生类定义的函数。如果父类或者祖先类中函数func()为虚函数,则子类及后代类中,函数func()是否加virtual关键字,都将是虚函数。为了提高程序的可读性,建议后代中虚函数都加上virtual关键字。
文章参考大话设计模式及其他网上文章,侵删。
三、小结
在工厂中我们使用了静态函数,当然也可以不使用静态函数。
将C++多态性质放在设计模式中具体应用,有助于提高面向对象的编程能力。
分享自己的编程学习历程!