Charpter01简单工厂模式

半世苍凉 提交于 2020-02-29 11:48:36

 一、UML类图

 

面向对象编程时,在整理对象之间关系时,用UML类图梳理,会更加清晰。

二、简单工厂模式

1.简单工厂模简介

简单工厂模式,利用一个工厂来生产不同类型的对象,达到服务层代码根据需求更改时,客户端代码接口不用进行修改。客户端可直接创建自己新增的需求对象并进行操作。由于比较简单,见代码很容易理解,故不做赘述。

2.C++代码如下

//定义基类操作数OperatorDP  
#ifndef _MOPERATORDP_HPP
#define _MOPERATORDP_HPP

class OperatorDP{
    public:
    OperatorDP() = default;
    OperatorDP(double _num1, double _num2) : num1(_num1), num2(_num2){}

    double getNum1(){return num1;}
    double getNum2(){return num2;}
    void setNum1(double num){num1 = num;}
    void setNum2(double num){num2 = num;}

    virtual double getResult() = 0; // 虚函数

    private:
    double num1;
    double num2;
};#endif
// 加法类
#ifndef _ADDDP_HPP
#define _ADDDP_HPP

#include"operatordp.hpp"

class AddDP : public OperatorDP{

    public:
    AddDP(double n1, double n2):OperatorDP(n1, n2){}
    virtual double getResult(){
        return getNum1() + getNum2();
    }
};
#endif
//减法类
#ifndef _SUBTRACTDP_HPP
#define _SUBTRACTDP_HPP
#include"operatordp.hpp"

class SubtractDP:public OperatorDP{
    public:
    SubtractDP(double n1, double n2):OperatorDP(n1, n2){}
    virtual double getResult(){
        return getNum1() - getNum2();
    }
};

#endif
//乘法类
#ifndef _MULTIPLYDP_HPP
#define _MULTIPLYDP_HPP

#include"operatordp.hpp"

class MultiplyDP:public OperatorDP{
    public:
    MultiplyDP(double n1, double n2):OperatorDP(n1, n2){}
    virtual double getResult(){
        return getNum1() * getNum2();
    }
};

#endif
//除法类
#ifndef _DIVIDEDP_HPP
#define _DIVIDEDP_HPP

#include<iostream>
#include<cmath>
#include"operatordp.hpp"

using namespace std;
class DivideDP : public OperatorDP{
    public:
    DivideDP(double n1, double n2):OperatorDP(n1, n2){}
    virtual double getResult(){
    
        if(abs(getNum2()) < e){
            cout << "divisor can't be zero"<<endl;
            getchar();
            abort();
        }
        else{
            return getNum1() / getNum2();
        }
        
    }
    private:
    static const double e;
};
const double DivideDP::e = 0.000000000001;

#endif
// 测试
#include<iostream>
#include"adddp.hpp"
#include"dividedp.hpp"
#include"multiplydp.hpp"
#include"subtractdp.hpp"

using namespace std;

int main(){
    AddDP myadd(5,3);
    cout << myadd.getResult()<<endl;
    
    SubtractDP mysubtract(6,2);
    cout << mysubtract.getResult()<<endl;

    DivideDP mydivide(5,0);
    cout << mydivide.getResult()<<endl;
    
    MultiplyDP mymultiply(10,2);
    cout << mymultiply.getResult()<<endl;

    getchar();
    return 0;
}

 通过代码我们很容易就能发现,如果客户想新增加一个需求比如指数运算,那么只需新建一个继承OperatorDP的指数类,然后实现里面的方法getResult()就行了。对客户端来书,只需创建一个新的指数类对象,并调用方法getResult()。可见客户使用方法没变。服务端代码也实现了解耦,使代码更加易于维护。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!