其他分享
首页 > 其他分享> > 设计模式——简单工厂

设计模式——简单工厂

作者:互联网

第一版: 简单实现

  在int main 主函数中读取数据,使用switch语句分别进行操作。不同操作用类实现。

 

#include <iostream>
using namespace std;
    static int num_a;
    static int num_b;
    static char op;


void input_num()
{
    cout<<"input_num : ";
}
void input_op()
{
    cout<<"input_op : ";
}
class Op_Add
{
    public:
        int calc()
        {
            return num_a+num_b;
        }    
};
class Op_Minus
{
    public:
        int calc()
        {
            return num_a-num_b;
        }    
};
class Op_Mut
{
    public:
        int calc()
        {
            return num_a*num_b;
        }    
};
class Op_Div
{
    public:
        int calc()
        {
            if(num_b)
            {
                return num_a/num_b;
            }
            else
            {
                cout<<"分母为0"<<endl;
                return 0;
            }
            
        }    
};
int main(int argc, char *argv[])
{

    input_num();
    cin>>num_a;
    input_num();
    cin>>num_b;
    input_op();
    cin>>op;
    switch (op)
    {
        case '+':
        {
            Op_Add op1;
            cout<<"result is "<<op1.calc()<<endl;
            break;
        }
        case '-':
        {
            Op_Minus op2;
            cout<<"result is "<<op2.calc()<<endl;
            break;
        }
        case '*':
        {
            Op_Mut op3;
            cout<<"result is "<<op3.calc()<<endl;
            break;
        }
        case '/':
        {
            Op_Div op4;
            cout<<"result is "<<op4.calc()<<endl;
            break;
        }
        default:
            break;
        
        
    }
    return 0;
}

 

第二版:输入数据和计算结果分离

  使用Input类输入数据,operation类实现计算。

  int main主函数语句变少。

#include <iostream>
using namespace std;
//依据使用习惯,输入数字,再输入运算符 
//使用静态变量存储要进行操作的数和符号 
//Input类从终端读取数据
 

static int num_a=0;
static int num_b=0;
static char op;
class Input 
{
    public:
        void input_num();
        void input_op();
        //static int num_a;    
        //static int num_b;    
        //char op;
        istream& set_num_a(istream& is);
        istream& set_num_b(istream& is);
        istream& set_op(istream& is);
        void read_data()
        {
            set_num_a(cin);
            cout<<"input num_a"<<endl;
            set_num_b(cin);
            cout<<"input num_b"<<endl;
            set_op(cin);
            cout<<"input op"<<endl;
            cout<<"input done"<<endl;
        }
        
};

void Input::input_num()
{
    cout<<"input_num : ";
}
void Input::input_op()
{
    cout<<"input_op : ";
}
istream& Input::set_num_a(istream& is)
{
    this->input_num();
    is >> num_a;
    //this->num_a = _a;
}
istream& Input::set_num_b(istream& is)
{
    this->input_num();
    is >> num_b;
    //this->num_b = _b;
}
istream& Input::set_op(istream& is)
{
    this->input_op();
    is >> op;
    //this->op = _op;
}
class Op_four //貌似没用的纯虚类 
{
    public:
        virtual int calc()=0;    
        
} ;
class Op_Add: public Op_four
{
    public:
        int calc()
        {
            cout<<"num_a "<<num_a<<endl;
            cout<<"num_b "<<num_b<<endl;
            return num_a+num_b;
        }    
};
class Op_Minus: public Op_four
{
    public:
        int calc()
        {
            return num_a-num_b;
        }    
};
class Op_Mut: public Op_four
{
    public:
        int calc()
        {
            return num_a*num_b;
        }    
};
class Op_Div: public Op_four
{
    public:
        int calc()
        {
            if(num_b)
            {
                return num_a/num_b;
            }
            else
            {
                cout<<"分母为0"<<endl;
                return 0;
            }
            
        }    
};
class Op_sqrt: public Op_four
{
    public:
        int calc()
        {
            if(num_a >=0 )
            {
                //开更号(假装完成)
             cout<<"开更号"<<endl; 
            }    
        }
         
        
};
class Operation //运算类 
{
    public:
        
        int get_result(int _a,int _b,char _op)
        {
            int result;
            
    switch (_op)
    {
        case '+':
        {
            Op_Add op1;
            cout<<"result is "<<op1.calc()<<endl;
            break;
        }
        case '-':
        {
            Op_Minus op2;
            cout<<"result is "<<op2.calc()<<endl;
            break;
        }
        case '*':
        {
            Op_Mut op3;
            cout<<"result is "<<op3.calc()<<endl;
            break;
        }
        case '/':
        {
            Op_Div op4;
            cout<<"result is "<<op4.calc()<<endl;
            break;
        }
        case 's':
        {
            Op_sqrt op5;
            cout<<"result is "<<op5.calc()<<endl;
        }
        default:
            break;
        
        
    }
            
        }    
};
int main(int argc, char *argv[])
{
    Input input;
    input.read_data();
    Operation op1;
    op1.get_result(num_a,num_b,op);

    
    return 0;
}

 

第三版:

  简单工厂模式:产品和工厂类。产品为抽象类,可以派生出不同的产品,工厂类中有switch语句可以进行判断。

 

#include <iostream>
using namespace std;
//先输入运算符,再输入数据 
//定以四则运算的抽象类,作为父类,具有操作数字段 
class Op_four// 抽象类 
{
    private:
        int _num_a=0;
        int _num_b=0;
    public:
        virtual int calc()=0;//重载函数 
        //获取运算符 
        int get_num_a()
        {
            return _num_a;
        }
        int get_num_b()
        {
            return _num_b;
        }
        //设置操作数 
        void set_num_a(istream& is)
        {
            cout<<"input_num : ";
            is >> this->_num_a ;
        }
        void set_num_b(istream& is)
        {
            cout<<"input_num : ";
            is >> this->_num_b ;
        }
            
        
} ;
class Op_Add: public Op_four
{
    public:
        int calc()
        {
            //cout<<"num_a "<<num_a<<endl;
            //cout<<"num_b "<<num_b<<endl;
            return get_num_a()+get_num_b();
        }    
};
class Op_Minus: public Op_four
{
    public:
        int calc()
        {
            return get_num_a()- get_num_b();
        }    
};
class Op_Mut: public Op_four
{
    public:
        int calc()
        {
            return get_num_a()*get_num_b();
        }    
};
class Op_Div: public Op_four
{
    public:
        int calc()
        {
            if(get_num_b())
            {
                return get_num_a()/get_num_b();
            }
            else
            {
                cout<<"分母为0"<<endl;
                return 0;
            }
            
        }    
};
/*class Op_sqrt: public Op_four
{
    public:
        int calc()
        {
            if(num_a >=0 )
            {
                //开更号
             cout<<"开更号"<<endl; 
            }    
        }
         
        
};*/
class OperationFactory //运算工厂类 
{
    public:
        
        int get_result(char _op)
        {
            int result;
            
    switch (_op)
    {
        case '+':
        {
            Op_Add op1;
            op1.set_num_a(cin);
            op1.set_num_b(cin);
            
            cout<<"result is "<<op1.calc()<<endl;
            break;
        }
        case '-':
        {
            Op_Minus op2;
            op2.set_num_a(cin);
            op2.set_num_b(cin);
            cout<<"result is "<<op2.calc()<<endl;
            break;
        }
        case '*':
        {
            Op_Mut op3;
            op3.set_num_a(cin);
            op3.set_num_b(cin);
            cout<<"result is "<<op3.calc()<<endl;
            break;
        }
        case '/':
        {
            Op_Div op4;
            op4.set_num_a(cin);
            op4.set_num_b(cin);
            cout<<"result is "<<op4.calc()<<endl;
            break;
        }
        /*case 's':
        {
            Op_sqrt op5;
            cout<<"result is "<<op5.calc()<<endl;
        }*/
        default:
            break;
        
        
    }
            
        }    
};
int main(int argc, char *argv[])
{
    OperationFactory *of=new OperationFactory();
    //输入要进行的运算符号 
    of->get_result('-');
    delete of;
    
    return 0;
}

 

标签:set,int,工厂,num,static,istream,简单,设计模式,op
来源: https://www.cnblogs.com/pine-apple/p/16124135.html